https://github.com/SewellDinG/Pentest-Notes

第1章:内网渗透测试基础

本章系统地讲解了内网工作组、域、活动目录、域内权限解读等,并介绍了内网域环境和渗透测试环境(Windows、Linux)的搭建方法和常用的渗透测试工具。

内网

内网也指局域网(Local Area Network,LAN)是指在某一区域内由多台计算机互联成的计算机组。

工作组

工作组(Work Group)就像一个可以自由进入和退出的社团,方便同组的计算机互相访问。没有集中管理作用,所有计算机都是对等的

域(Domain)是一个有安全边界的计算机集合。 可以简单的把域理解成升级版的工作组,但有一个严格的集中管理控制机制。

域控制器(Domain Controller,DC)相当于一个单位的门禁系统。DC中存在由这个域的账户、密码、属于这个域的计算机等信息构成的数据库DC是整个域的通信枢纽。

域环境:单域、父域和子域、域树(tree)、域森林(forest,林)、DNS域名服务器

活动目录

活动目录(Active Directory,AD)是域环境中提供目录服务的组件。 目录用于存储有关网络对象(如用户、组、计算机、共享资源、打印机和联系人等)的信息。目录服务是帮助用户快速准确的从目录中查找到他所需要的信息的服务。其中将层次结构的目录及索引信息存储在数据库中,就是活动目录数据库(AD库)。

管理层次分明:A集团(域森林) -> 子公司(域树) -> 部门(域) -> 员工

AD相当于树干。

活动目录有什么功能?

  1. 帐号集中管理:所有帐号均存储在服务器中,以便执行命令和重置密码等。
  2. 软件集中管理:统一推送软件,统一安装网络打印机等。利用软件发布策略分发软件,可以让用户自由选择安装软件。
  3. 环境集中管理:利用AD可以统一客户端桌面,IE,TCP/IP等设置。
  4. 增强安全性:统一部署杀毒软件和病毒扫描任务、集中化管理用户的计算机权限、统一制订用户密码策略等。可以监控网络,对资料进行统一管理。
  5. 更可靠,更少的宕机时间:例如:利用AD控制用户访问权限,利用群集、负载均衡等技术对文件服务器进行容灾设定。网络更可靠,岩机时间更少。

DC和AD区别?

如果内网中的一台计算机上安装了AD,它就变成了DC(用于存储AD库的计算机)。

DC的本质是一台计算机,AD的本质是提供目录服务的组件。

安全域的划分

安全域划分的目的是将一组安全等级相同的计算机划入同一个网段内, 在网络边界上通过防火墙来实现对其他安全域的NACL(网络访问控制策略), 使得其风险最小化。

一般安全域划分为:DMZ和内网。

DMZ(Demilitarized Zone 非军事化区)称为隔离区。 为了解决安装防火墙后外部网络不能访问内部网络服务器的问题,而设立的一个非安全系统与安全系统之间的缓冲区。

DMZ不能访问内网,DMZ不能访问外网(此策略有例外,如mail服务)。

内网又可以划分为:办公区和核心区。

办公区会安装防病毒软件、主机入侵检测产品(HIDS)等,运维使用堡垒机(跳板机)来统一管理用户的登陆行为。

域内计算机分类

域控制器、成员服务器、客户机和独立服务器。

域内权限

域内置组分为:域本地组(Domain Local Group)、全局组(Global Group)、通用组(Universal Group)。管理员通过配置安全组访问权限,就可以为所有加入安全组的用户账号配置同样的权限。

全局组相当于域账号,可以在全局使用,域本地组相当于本地账号,只能本机上使用。

e.g. 将用户张三(域帐号Z3)加入到域本地组administrators中,并不能使Z3对非DC的域成员计算机有任何特权,但若加入到全局组Domain Admins中,张三就是域管理员了,可以在全局使用,对域成员计算机是有特权的。

A-G-DL-P策略, A(Account)、G、 DL、 P(Permission),是指将用户账号添加到全局组中,将全局组添加到域本地组中,然后为域本地组分配资源权限。 在A-G-DL-P策略形成以后,当给一个用户某一个权限的时候,只要把这个用户加入到某一个域本地组就可以了。

e.g. 有两个域,A和B,A中的5个财务人员和B中的3个财务人员都需要访问B中的“FINA”文件夹。这时,可以在B中建一个DL(域本地组),因为DL的成员可以来自所有的域,然后把这8个人都加入这个DL,并把FINA的访问权赋给DL。这样做的坏处是什么呢?因为DL是在B域中,所以管理权也在B域,如果A域中的5 个人变成6个人,那只能A域管理员通知B域管理员,将DL的成员做一下修改,B域的管理员太累了。这时候,我们改变一下,在A和B域中都各建立一个全局组(G),然后在B域中建立一个DL,把这两个G都加入B域中的DL中,然后把FINA的访问权赋给 DL。哈哈,这下两个G组都有权访问FINA文件夹了,是吗?组嵌套造成权限继承嘛!这时候,两个G分布在A和B域中,也就是A和B的管理员都可以自己管理自己的G啦,只要把那5个人和3个人加入G中,就可以了!以后有任何修改,都可以自己做了,不用麻烦B域的管理员!这就是A-G-DL-P。

域本地组来自全林,作用于本域;全局组来自本域,作用于全林;通用组来自全林,作用于全林。

常用DL: Administrators(管理员组),最重要的权限; Remote Desktop Users(远程登录组)。

常用G: Domain Admins(域管理员组),最最重要的权限,一般来说域渗透是看重这个; Domain Users(域用户组)。

常见U: Enterprise Admins(企业系统管理员组)、 Schema Admins(架构管理员组),也是最最重要的权限。

第2章:内网信息搜集

内网渗透测试的核心是信息搜集。本章主要介绍了当前主机信息搜集、域内存活主机探测、域内端口扫描、域内用户和管理员权限的获取、如何获取域内网段划分信息和拓扑架构分析等,并介绍了域分析工具BloodHound的使用。

搜集本机信息

网络配置信息、操作系统及软件的信息、本机服务信息、进程列表、启动程序信息、计划任务、主机开机时间、用户列表、连接会话、端口列表、补丁列表、本机共享列表、路由表和Arp缓存表、防火墙相关配置、代理配置情况、远程连接服务等。

WMIC(Windows Management Instrumentation Command-Line,Windows管理工具命令行)是最有用的Windows命令行工具。Windows7以上版本的低权限用户才允许访问WMIC并执行相关查询操作。使用WMIC,不仅可以管理本地计算机,还可以管理同一域内的所有计算机(需要一定权限),而且在被管理的计算机上不可事先安装WMIC。

WMIC在信息搜集he后渗透测试阶段是非常实用的,可以调取和查看目标机器的进程、服务、用户、用户组、网络连接、硬盘信息、网络共享信息、已安装的补丁、启动项、已安装的软件、操作系统的相关信息、时区等。使用wimic /?查看alias。

设置计划任务at在Win8已经弃用,取而代之的是schtasks

安全狗禁止net,360也会弹窗,可以尝试net1,或者使用wmic,如net user -> wmic useraccount。

查询当前权限

有三种情况:本地普通用户、本地管理员用户、域内用户。

如果当前内网中存在域,那么本地普通用户只能查询本机相关信息,不能查询域内信息;而本地管理员用户和域内用户可以查询域内信息。

域内的所有查询都是通过域控制器实现的(基于LDAP协议),而这个查询需要经过权限认证,所以,只有域用户才拥有这个权限;当域用户执行查询命令时,会自动使用Kerberos协议进行认证,无需额外输入账号和密码。

本地管理员Administrator权限可以直接提升为System权限(使用PsExec等),因此,在域中,除普通用户外,所有的机器都有一个机器用户(用户名为机器名加上$)。在本质上,机器的system用户对应的就是域里面的机器用户。所以,使用System权限也可以运行域内的查询命令。

判断是否存在域

域控制器和DNS服务器是否在同一台服务器上?(使用nslookup反向解析)

systeminfo中的域即域名、登陆服务器指的是域控制器。

使用net time /domain可以判断当前用户是否是域用户(错误5),是否存在域。

探测域内存活主机

NetBIOS是局域网程序使用的一种API,为程序提供了请求低级别服务的统一的命令集。NetBIOS也是计算机的标识名,主要用于局域网中计算机的互访。

e.g. ARP(nbtscan、arp-scan)、ICMP(ping)、TCP/UDP(portscan、scanline)

扫描域内端口

端口的Banner信息,使用nc、telnet可以快速获取。

收集域内基础信息

域内查询命令在本质上都是通过LDAP协议到域控制器上进行查询的。

查询域、域内所有计算机、域内所有用户组列表(Domain Admins、Domain Controllers、Domain Users)、获取域密码信息、获取域信任信息。

在默认情况下,Domain Admins 和 Enterprise Admins 对域内所有域控制器有完全控制权限。

查找域控制器

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

查询所有域用户列表,查询域管理员用户。

域内Domain Admins组中的用户默认为域内机器的本地管理员用户。

定位域管理员

在内网中,通常会部署大量的网络安全系统和设备,例如IDS、IPS、日志审计、安全网关、反病毒软件等。

在一个域中,当计算机加入域后,会默认给域管理员组赋予本地系统管理员权限。也就是说,当计算机被添加到域中,成为域的成员主机后,系统会自动将域管理员组添加到本地系统管理员组中。因此,域管理员组的成员均可访问本地计算机,且具备完全控制权限。

在Windows域中取得了普通用户权限,希望在域内横向移动,需要知道域内用户登录的位置、他是否是任何系统的本地管理员、他所属的组、他是否有权访问文件共享等。

e.g. psloggedon.exe、PVEFindADUser.exe、netsess.exe、hunter、NetView、PowerView等

查找域管理进程

在获取了管理员权限的系统中寻找域管理员登录进程,进而搜集域管理员的凭据。

渗透测试人员在某个内网环境中获得了一个域普通用户的权限,首先通过各种方法获得当前服务器的本地管理员权限,然后分析当前服务器的用户登录列表及会话信息,知道哪些用户登陆了这台服务器。如果渗透测试人员通过分析发现,可以获取权限的登录用户都不是域管理员账户,同时没有域管理员组的用户登录这台服务器,就可以使用另一个账号并寻找该账号在内网的哪台机器上具有管理权限,再枚举这台机器上的登录用户,然后继续进行渗透测试,直至找到一个可以获取域管理员权限的有效路径为止。

域管理员模拟

第4章介绍

内网划分及拓扑结构

分析目标服务器所使用的的Web服务器、后端脚本、数据库、系统平台等。

常见Web架构:

  • ASP + Access + IIS 5.0/6.0 + Windows Server 2003
  • ASPX + MSSQL + IIS 7.0/7.5 + Windows Server 2008
  • PHP + MySQL + IIS、Apache、Nginx
  • JSP + MSSQL、ORACLE + Tomcat

内网通常分为DMZ、办公区和核心区(生产区)。

第3章:隐藏通信隧道技术

网络隐藏通信隧道是与目标主机进行信息传输的主要工具。在大量TCP、UDP通信被防御系统拦截的情况下,DNS、ICMP等难以禁用的协议已经被攻击者利用,成为攻击者控制隧道的主要通道。

本章详细介绍了IPv6隧道、ICMP隧道、HTTPS隧道、SSH隧道、DNS隧道等加密隧道的使用方法,并对常见的SOCKS代理工具及内网上传/下载方法进行了解说。

判断内网的连通性

隐藏通信隧道技术常用于在访问受限的网络环境中追踪数据流向和在非受信任的网络中实现安全的数据传输。

在实际的网络中,通常会通过各种边界设备、软/硬件防火墙甚至入侵检测系统来检查主机对外的网络连接情况,如果发现异常,就会对通信进行阻断。

隧道,就是一种绕过端口屏蔽的通信方式。防火墙两端的数据包通过防火墙所允许的数据包类型或者端口进行封装,然后穿过防火墙,与对方进行通信。当被封装的数据包到达目的地时,将数据包还原,并将还原后的数据包发送到相应的服务器上。

e.g. ICMP(ping)、TCP/UDP(nc)、HTTP(curl)、DNS(nslookup baidu.com VPS、dig baidu.com @VPS)

网络层隧道技术(IPv6、ICMP)

IPv6隧道:可以将IPv4作为隧道载体,将IPv6报文整体封装在IPv4数据报文中。e.g. socat、6tunnel、nt6tunnel等

ICMP隧道:在一般的通信协议中,如果两台设备要进行通信,肯定需要开放端口,而在ICMP协议下就不需要。e.g. icmpsh、PingTunnel、icmptunnel、powershell icmp等

防御:检测数量、报文大小、特征标识等。一个正常的ping每秒最多发送两个数据包,而使用ICMP隧道数量会激增。

传输层隧道技术(TCP、UDP)

e.g. lcx、netcat(nc -c参数)、PowerCat

各种语言的反弹shell。

应用层隧道技术(SSH、HTTP/s、DNS)

SSH:-CfNg,-L本地端口转发,-R远程端口转发,-D动态转发(SOCKS代理)

防御:白名单、ACL限制请求IP。

HTTP/s:reGeorg、meterpreter、tunna等

DNS:DNS是一个必不可少的服务,DNS报文本身具有穿透防火墙的能力。

从DNS协议的角度看,只是在一次次的查询某个特定的域名并得到解析结果,但其本质问题是,预期的返回结果应该是一个IP地址,而事实返回的是任意字符串,包括加密的C2指令。

DNS隧道本质是将其他协议封装在DNS协议中进行传输。

SOCKS代理

SOCKS是”SOCKetS”的缩写。

SOCKS4只支持TCP协议;SOCKS5不仅支持TCP/UDP协议,还支持各种身份验证机制。

SOCKS代理更底层,是在会话层;而HTTP代理是在应用层。因此SOCKS代理可以代理一切客户端的连接,而HTTP代理只能代理使用HTTP协议的客户端。由于更底层,不需要处理高级协议的细节,所以socks代理更快。

SOCKET被称作”套接字”,用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同计算机之间的通信,它的本质是编程接口(API),是对TCP/IP的封装。SOCKS是一个代理协议,目前最新版本为SOCKS5,所谓代理就是,你可以通过它的去间接的访问网络,相当于一个中转站。区别:SOCKET是一个API,一个工具,让你建立网络连接用的。SOCKS是协议,是一组数据结构。

目前VPN隧道协议主要有4种:点到点隧道协议PPTP、第二层隧道协议L2TP、网络层隧道协议IPSec以及SOCKS v5协议。其中,PPTP和L2TP工作在数据链路层,IPSec工作在网络层,SOCKS v5工作在会话层。

e.g. EarthWorm(ew、新版本Termite)、reGeorg、sSocks、SocksCap64(SSTap)、Proxifier、ProxyChains

压缩数据

e.g. rar.exe、7z.exe

上传和下载

e.g. ftp、vbs、bitsadmin、powershell等等

Powershell的最大优势在于以.NET框架为基础,.NET框架在脚本领域几乎是无所不能的,因此ps1脚本文件的执行默认是被禁止的。

第4章:权限提升分析及防御

本章主要分析了系统的内核溢出漏洞提权、利用Windows操作系统错误配置提权、利用组策略首选项提权、绕过UAC提权、令牌窃取及无凭证条件下的权限获取,并提出了相应的安全防范措施。

在Windows中,权限大概分为四种:User(普通用户权限,默认不允许修改系统的设置或用户资料)、Administrator(管理员权限,可以利用Windows的机制将自己提升为System权限)、System(系统权限,可以对SAM等敏感文件进行读取)、TrustedInstaller(最高权限,不涉及,作用于系统文件)。

常见的提权方法有系统内核溢出漏洞提权、数据库提权、错误的系统配置提权、组策略首选项提权、Web中间件漏洞提权、DLL劫持提权、滥用高权限令牌提权、第三方软件/服务提权等。

内核溢出漏洞

使用whoami /groups查看当前权限。如果有Mandatory Label\Medium Mandatory Level,说明是一个标准用户,需要提权至Mandatory Label\High Mandatory Level管理员权限。

发现缺失补丁:systeminfo、wmic qfe、Metasploit(post/windows/gather/enum_patches、post/multi/recon/local_exploit_suggester)、Windows-Exploit-Suggester、PowerShell(Sherlock)

系统配置错误

Windows操作系统中的常见配置错误包括管理员凭据配置错误、服务配置错误、故意削弱的安全措施、用户权限过高等。

1、系统服务权限配置错误

Windows系统服务文件在操作系统启动时加载和执行,并在后台调用可执行文件。因此,如果一个低权限的用户对此类系统服务调用的可执行文件拥有写权限,就可以将该文件替换成任意可执行文件,并随着系统服务的启动获得系统权限。

服务正在运行且无法被终止:攻击者通常会利用DLL劫持技术并尝试重启服务来提权。

Metasploit的service_permissions模块使用两种方法来获得System权限:如果meterpreter以管理员权限运行,该模块会尝试创建并运行一个新的服务;如果当前权限不允许创建服务,该模块会判断哪些服务的文件或者文件夹的权限有问题,并允许对其进行劫持。

2、注册表键AlwaysInstallElevated

Windows允许低权限用户以System权限运行安装文件,如果启用此策略设置项,那么任何权限的用户都能以System权限来安装MSI文件。

Windows Installer是Windows操作系统的组件之一,专门用来管理和配置软件服务,其分为客户端安装服务(Msiexec.exe)和MSI文件两部分。Windows Installer通过Msiexec.exe安装MSI文件包含的程序,双击MSI文件就会运行Msiexec.exe。

3、可信任服务路径漏洞(Trusted Service Paths)

如果一个服务的可执行文件的路径没有被双引号引起来且包含空格(可信任服务路径),那么这个服务就是有漏洞的。

因为Windows服务通常都是以System权限运行的,所以系统在解析服务所对应的文件路径中的空格时,也会以系统权限运行。前提还是有对应目标的写权限。

如:C:\Program Files\Some Folder\Service.exe寻找路径为C:\Program.exeC:\Program Files\Some.exeC:\Program Files\Some Folder\Service.exe

也是劫持的意思。

Metasploit的trusted_service_path模块反弹的shell很快就会中断,这是因为当一个进程在系统中启动后,必须与服务控制管理器进行通信,如果没有进行通信,服务控制管理器会认为出现了错误,进而终止掉这个进程。因此,在终止前将它迁移到其他进程中(set AutoRunScript migrate -f 自动迁移)。

4、自动安装配置文件

域环境下批量部署可能会使用到配置文件,其中可能包含本地管理员的账号密码等信息,Metasploit的enum_unattend模块。

5、计划任务

基于杀毒软件的检测等,攻击者会尽量避免接触目标机器的磁盘,而AccessChk是微软官方提供的工具,一般不会引起杀毒软件的报警,所以经常会被攻击者利用。

还是劫持。

e.g. PowerUp(allchecks)

组策略首选项提权漏洞

SYSVOL是活动目录里面的一个用于存储域公共文件服务器副本的共享文件夹,是安装AD是自动创建的,主要用来存放登陆脚本、组策略数据及其他域控制器需要的域信息等。

为了方便地对所有的机器进行操作,网络管理员往往会使用组策略进行统一的配置和管理。通过组策略统一修改的密码,虽然强度有所提高,但所有机器的本地管理员密码是相同的。常见的组策略首选项(Group Policy Preferences,GPP):创建本地用户、数据源(DataSources.xml)、创建/更新服务(Services.xml)、计划任务(ScheduledTasks.xml)等。

管理员在域中新建一个组策略后,操作系统会自动在SYSVOL共享目录中生成一个XML文件,该文件保存了该组策略更新后的密码,但是使用AES256加密,但但是2012年微软公布了私钥,XML文件中关键词cpassword。

2014年官方发布了补丁,不再将密码保存到组策略首选项中….老洞

绕过UAC提权

Microsoft 自 Windows Vista 中引入了 UAC (User Account Control)机制并在 Windows 7 中对 UAC 机制进行了完善。UAC 与 UNIX 中的 sudo 的工作机制十分相似。平时用户以普通权限工作,当用户需要执行特权操作时,系统会询问他们是否要提升其权限。

UAC有四种设置要求:始终通知仅在程序试图更改我的计算机时通知我(默认)、仅在程序试图更改我的计算机时通知我(不降低桌面的亮度)、从不提示

BypassUAC有点这个意思:仅在程序试图更改我的计算机时通知我(默认) –> 从不提示。

防御:企业环境中防止绕过UAC最好的方法是不让内网机器的使用者拥有本地管理员权限,从而降低系统遭受攻击的可能性;家庭环境下设为始终通知,总是弹窗警告。

令牌窃取

令牌(Token)是指系统中的临时秘钥,相当于账户和密码,用于决定是否允许当前请求及判断当前请求是属于哪个用户的。

获取了令牌,就可以在不提供密码或其他凭证的情况下访问网络和系统资源。

访问令牌(Access Token)代表访问控制操作主体的系统对象。密保令牌(Security Token)也叫做认证令牌或者硬件令牌,是一种用于实现计算机身份校验的物理设备,例如U盾。会话令牌(Session Token是交互会话中唯一的身份标识符)。

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

如果目标系统中存在有效的令牌,可以通过Rotten Potato程序快速模拟用户令牌来实现权限提升。

假设网络中设置了域管理进程,Metasploit使用ps寻找并使用migrate命令迁移至该进程,若成功了可以直接添加域管理员net user name pass /ad /domain,添加域管理员组net group "domain admins" name /ad /domain

meterpreter的use incognito

Pass The Hass攻击见第5章。

防御:补丁、禁止来路不明的文件、令牌时效性、加密存储和多重验证保护、加密链路传输。

无凭证条件下的权限获取

LLMNR和NetBIOS欺骗攻击。

第5章:域内横向移动分析及防御

在内网中,从一台主机移动到另外一台主机,可以采取的方式通常有文件共享、计划任务、远程连接工具、客户端等。

本章系统的介绍了域内横向移动的主要方法,复现并剖析了内网域方面最重要、最经典的漏洞,同时给出了相应的防范方法。本章内容包括:常见远程连接方式的剖析;从密码学角度理解NTLM协议;PTT和PTH的原理;如何利用PsExec、WMI、smbexec进行横向移动;Kerberos协议的认证过程;Windows认证加固方案;Exchange邮件服务器渗透测试。

IPC

IPC(Internet Process Connection)是为了实现进程间通信而开放的命名管道。IPC可以通过验证用户名和密码获得相应的权限,通过ipc$可以与目标机器建立连接,利用这个连接可以在目标机器上运行命令。

net use \\192.168.1.1\ipc$ "pass" /user:adstudy\administrator

利用条件:开启139、445端口;管理员开启了默认共享。

HashDump

LM Hash,“LAN Manager Hash”,本质是DES加密,还是硬编码密钥,从Windows Vista和Windows Server 2008开始默认禁用,dump出的LM Hash为“aad3b435b51404eeaad3b435b51404ee”表示为空或被禁用。

NTLM Hash,“New Technology LM Hash”,MD4加密。

Hash散列可以通过在线数据库、彩虹表等来破解,也可以使用PTH(Pass the Hash 哈希传递)来进行横向渗透。

要想在Windows操作系统中抓取散列值或明文密码,必须将权限提升至System。本地用户名、散列值和其他安全验证信息都保存在SAM文件中。lsass.exe进程用于实现Windows的本地安全策略和登陆策略。可以使用工具将散列值和明文密码从内存中的lsass.exe进程或SAM文件中导出。

e.g. GetPassword、PwDump7、QuarksPwDump、mimikatz、PowerShell

SAM文件保存位置C:\Windows\System32\config,该文件不允许复制,但可以使用U盘进入PE系统进行复制。

利用reg导出SAM和System文件,通过mimikatz或者Cain来从文件读取hash。

利用任务管理器或者微软出品的Procdump导出lsass.dmp文件,通过mimikatz来从内存文件中获取hash。

Windows Server 2012开始默认关闭WDigest,使攻击者无法从内存中获取明文密码;2012以下版本,如果安装KB2871997补丁,同样效果。WDigest功能状态可以在注册表中查看修改。

Hashcat只支持CPU破解;oclHashcat支持GPU破解(AMD、NIVDA),支持破解Windows密码、Linux密码、Office密码、Wi-Fi密码、MySQL密码、SQL Server密码,以及由MD5、SHA1、SHA256等国际主流加密算法加密的密码。

如何防范hashdump?

1、Windows Server 2012 R2新增了一个名为受保护的用户组(Protected Users),只要将需要保护的用户放入该组,攻击者就无法使用mimikatz等工具抓取明文密码和散列值了。

2、安装KB2871997,是微软用来解决PsExec或IPC远程查看(c$)问题的补丁,能是本地账号不再被允许远程接入计算机系统,但是SID=500的本地管理员账号(默认Administrator)除外

3、微软在Windows XP中添加了一个名为WDigest的协议,该协议能够使Windows将明文密码存储在内存中,以方便用户登录本地计算机。

4、根据Debug权限确定哪些用户可以将调试器附加到任何进程或内核中,默认情况下只有Administrator。mimikatz在抓取散列值或明文密码时需要使用Debug权限(因为mimikatz需要和lsass进程进行交互)。将Administrator从Debug组中移除。

PTH

PTH(Pass the Hash 哈希传递)。在域环境中,用户登录计算机时使用的大都是域账号,大量计算机在安装时会使用相同的本地管理员账号和密码,因此,攻击者就能使用哈希传递攻击的方法登录内网中的其他计算机。

在Windows网络中,散列值就是用来证明身份的(有正确的用户名和密码散列值,就能通过验证)。从Windows Server 2012 R2开始,默认在内存中不会记录明文密码,因此,攻击者往往会使用工具将散列值传递到其他计算机中,进行权限验证,实现对远程计算机的控制。

进行身份验证时,不会使用明文口令,而是将明文口令通过系统API转换成散列值,再与数据库中存储的散列值进行对比,如果完全相同则表示验证成功。不过,攻击者在获得密码散列值之后,依旧可以使用pth攻击来模拟用户进行验证。

使用NTLM Hash进行哈希传递;使用AES-256秘钥进行哈希传递(Pass the Key)。

e.g. mimikatz

PTT

要想使用mimikatz的哈希传递功能,必须具有本地管理员权限。mimikatz同样提供了不需要本地管理员权限进行横向渗透测试的方法,例如票据传递(Pass the Ticket,PTT)。

PsExec

PsExec是微软官方PsTools工具包中的软件,期初主要是用于大批量Windows主机的运维,在域环境下效果甚好。

通过PsExec,可以在远程计算机上执行命令,也可以将管理员权限提升到System权限以运行指定的程序。

PsExec的基本原理是:通过管道在远程目标计算机上创建一个psexec服务,并在本地磁盘中生成一个名为“PSEXECSVC”的二进制文件,然后通过psexec服务运行命令,运行结束后删除任务。

需要远程系统开启admin$共享(默认是开启的),会产生大量日志。

e.g. Metasploit

WMI

WMI,Windows Management Instrumentation,从Windows 98开始支持,可以在本地或者远程管理计算机系统。

自从PsExec在内网中被严格监控后,越来越多的反病毒厂商将PsExec加入了黑名单,于是攻击者逐渐开始使用WMI进行横向移动。通过渗透测试发现,在使用wmiexec进行横向移动时,Windows默认不会记录WMI的操作日志。

使用wmic远程执行命令,在远程系统中启动Windows Management Instrumentation服务(目标服务器需要开放135端口,wmic会以管理员权限在远程系统中执行命令)。如果服务器开启了防火墙,wmic将无法进行连接。此外,wmic命令如果没有回显,可以将命令结果输出到某文件,并使用ipc$和type来读取信息。如果wmic执行的是恶意程序,将不会留下日志。

e.g. wmic、wmiexec.py、wmiexec.vbs、Invoke-WmiCommand.ps1、Invoke-WMIMethod

DCOM

DCOM(Distributed Component Object Model,分布式组件对象模型)是微软的一系列概念和程序接口。通过DCOM,客户端程序对象能够对网络中的另一台计算机上的服务器程序对象发送请求。

DCOM是基于组件对象模型(COM)的。COM提供了一套允许在同一台计算机上的客户端和服务端之间进行通信的接口。

执行流程同样:通过ipc$连接远程计算机;执行命令。

SPN

微软给与内的每种资源分配了不同的服务主体名称(Service Principal Name,SPN)。

因为域环境中的每台服务器都需要在Kerberos身份验证服务中注册SPN,所以攻击者会直接向域控制器发送查询请求,获取其需要的服务的SPN,从而知晓其需要使用的服务资源在哪台机器上

SPN扫描也称作“扫描Kerberos服务实例名称”,在活动目录中发现服务的最佳方法就是SPN扫描。与网络端口扫描相比,SPN扫描的主要特点是不需要通过连接网络中的每个IP地址来检查服务端口(不会因触发内网中的IPS、IDS等设备的规则而产生大量的警告日志)。因为SPN查询是Kerberos票据行为的一部分,所以检测难度较大。

SPN是通过LDAP协议向域控制器进行查询的,所以,攻击者只要获得一个普通的域用户权限就可以进行SPN扫描。

Kerberoast攻击。导出票据,破解票据。

防御:确保服务账号密码的长度超过25位;确保密码的随机性(避免相同);定期修改密码。

Exchange

电子邮件中可能包含大量的源码、企业内部通讯录、明文密码、敏感业务登陆地址及可以从外网访问内网的VPN账号密码等信息。

Exchange支持PowerShell对其进行本地或远程操作。

邮箱服务器、客户端访问服务器、集线传输服务器是核心角色,只要部署这三个角色就能提供基本的电子邮件处理功能,且这仨可以部署在同一台主机上。

邮件发送使用统一的通信协议,即SMTP(简单邮件传输协议);邮件接收则会使用多种协议标准,如从POP(邮局协议)发展而来的POP3,以及使用较为广泛的IMAP(Internet邮件访问协议)。Exchange开发了私有的MAPI协议用于收取邮件。

Exchange支持的访问接口和协议:

  • OWA(Outlook Web App):Exchange提供的Web邮箱。
  • EAC(Exchange Administrative Center):Exchange管理中心,后台。
  • Outlook Anywhere(RPC-over-HTTP,RPC/HTTP)
  • MAPI(MAPI-over-HTTP,MAPI/HTTP)
  • Exchange ActiveSync(EAS,XML/HTTP)
  • Exchange Web Service(EWS,SOAP-over-HTTP)

Exchange服务发现:基于端口扫描发现(nmap)、SPN查询(在安装Exchange时,SPN就被注册在AD中了)

Exchange数据库的后缀为“.edb”,存储在Exchange服务器上,使用PowerShell可以查看相应信息。

Exchange邮件的文件后缀为“.pst”。

UNC(Universal Naming Convention,通用命名规则,也称通用命名规范、通用命名约定)。类似于\\hostname\sharename\\ip\address\sharename的网络路径就是UNC路径,sharename为网络共享名称。

第6章:域控制器安全

在实际网络环境中,攻击者渗透内网的终极目标是获取域控制器的权限,从而控制整个域。

本章介绍了使用Kerberos域用户提权和导出ntds.dit中散列值的方法,并针对域控制器攻击提出了有效的安全建议。

使用卷影拷贝服务提取ntds.dit

在活动目录中,所有的数据都被保存在ntds.dit文件中。ntds.dit是一个二进制文件,存储在DC的C:\Windows\NTDS\ntds.dit包含了域内的所有信息,可以通过分析ntds.dit导出域内的计算机信息及其他信息。它和SAM文件一样,是被系统锁定的。

卷影拷贝服务(Volume Shadow Copy Service,VSS)提取ntds.dit。VSS本质上属于快照(snapshot)技术,主要用于备份和恢复(即使目标文件处于锁定状态)。

e.g.

ntdsutil.exe,为AD提供管理机制的命令行工具,支持Windows2003、2008、2012。

vssadmin,是Windows 7及2008提供的VSS管理工具。支持类似功能的还有vssown.vbs。

也可以使用ntdsutil的IFM创建卷影拷贝。

diskshadow.exe,可以使用VSS并导出ntds.dit。微软官方出品,代码由微软签名,Windows 2008、2012、2016默认自带。导出ntds.dit时必须在C:\Windows\system32中操作。

导出ntds.dit后,可以利用reg将syste.hive转储。因为system.hive中存放着ntds.dit的秘钥,如果没有该秘钥将无法查看ntds.dit中的信息。

在渗透测试中,应该先将含有需要执行的命令的文本文件写入到远程目标系统,在使用diskshadow.exe调用执行该文件,使用更为灵活。

导出ntds.dit中的散列值

e.g. esedbexport、impacket中的secresdump、NTDSDumpex.exe解析ntds.dit并导出域账号和域散列值。

利用dcsync获取域散列值

mimikatz有个dcsync功能,可以利用卷影拷贝服务VSS直接读取ntds.dit并检索域散列值。但是,需要域管理员权限运行mimikatz才可以。lsadump::dcsync

也可以通过转储lsass.exe进程对散列值进行dump操作。lsadump::lsa

mimikatz命令执行结果太多,无法将其完全显示出来,可以先执行log命令(会在当前目录下生成一个文本文件,用于记录mimikatz的所有执行结果)。

其他获取域散列值方法

e.g. Metasploit、vshadow.exe和QuarkPwDump.exe

在正常的域环境下,ntds.dit文件里包含大量的信息,体积较大、不方便保存到本地。如果域控制器上没有安装杀软,攻击者就能直接进入域控制器,导出ntds.dit并获得域账号和域散列值,而不需要将nts.dit保存到本地。

Kerberos域用户提权漏洞

MS14-068、CVE-2014-6324、KB3011780,Windows2012 R2前均受影响。

如果攻击者获取了域内任何一台计算机的shell权限,同时知道任意域用户的用户名、SID、密码,即可获得域管理员权限,进而控制DC,最终获取域权限。

票据注入一般流程:查看DC的补丁安装情况(systeminfo、WMIC qfe)、查看用户的SID(whoami /user)、生成高权限票据(ms14-068.exe)、查看注入前的权限(dir \\DC\c$)、清除内存中的所有票据(mimikatz,kerberos::purge)、将高权限票据注入内存(kerberos::ptc)、验证权限。

e.g. meterpreter下load kiwi

修复建议:开启Windows Update、手动补丁、对域内账号进行控制、禁止使用弱口令、及时定期修改密码、安装反病毒软件、及时更新病毒库。

第7章:跨域攻击分析及防御

如果内网中存在多个域,就会面临跨域攻击。

本章对利用域信任关系实现跨域攻击的典型方法进行了分析,并对如何部署安全的内网生产环境给出了建议。

跨域攻击方法

大型企业一般通过域林进行共享资源。根据不同只能区分的部门,从逻辑上以主域和子域进行划分,以方便统一管理。在物理层,通常使用防火墙将各个子公司及各个部门划分为不同的区域。攻击者如果得到饿了某个子公司或者某个部门的域控制器全新啊,但没有得到整个公司内网的全部权限(或者需要的资源不在此域中),往往会想办法获取其他部门(或者域)的权限。

常见的跨域攻击方法有:常规渗透方法(例如利用Web漏洞跨域获取权限);利用已知域散列值进行哈希传递攻击或者票据传递攻击(例如DC的本地管理员密码相同);利用域信任关系进行跨域攻击。

域信任关系

默认情况下,特定Windows域中的所有用户都可以通过该域中的资源进行身份验证。

域信任的作用是解决多域环境中的跨域资源共享问题。域环境不会无条件的接受来自其他域的凭证,如果用户想要访问当前域边界以外的资源,需要使用域信任。域信任作为域的一种机制,允许另一个域的用户在通过身份验证后访问本域的资源。

从Windows 2003开始,域信任关系变为双向的,且可以通过信任关系进行传递。

只有Domain Admins组中的用户可以管理域信任关系。

在域中,Enterprise Admins组(仅出现在林的根域中)的成员具有对目录林中所有域的完全控制权限。默认情况下,该组包含林中所有域控制器上具有Administrator权限的成员。

获取域信息:lg.exe

利用域信任秘钥(NTLM Hash)获取目标域的权限:利用mimikatz导出信任秘钥并伪造信任票据(具有sidHistory)、利用asktgs请求TGS、利用kirbikator将TGS信息注入内存,获取目标域的权限。

使用mimikatz可以在构建黄金票据时设置sidHistory,因此,如果攻击者获取了任意域的krbtgt散列值,就可以利用sidHistory获得该林的完整权限。

利用krbtgt散列值获取目标域的权限:在DC上使用mimikatz获取krbtgt散列值、在子域使用普通用户权限构造并注入黄金票据,获取目标域的权限。

防范跨域攻击

外网Web往往会配置WAF以及配备维护人员定期安全检测,而内网的Web(内部办公、测试服务器等)更脆弱,往往存在弱口令和存在未及时补丁的漏洞。

在很多公司中,虽然为不同的部门划分了不同的域,但域管理员可能是同一批人,因此可能出现域管理员的用户名和密码相同的情况。攻击者在获取当前域的DC权限后,要先检查DC的本地管理员密码是否与其他域的DC本地管理员密码相同。

第8章:权限维持分析及防御

本章分析了常见的针对操作系统后门、Web后门及域后门(白银票据、黄金票据等)的攻击手段,并给出了相应的检测和防范方法。

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

操作系统后门

操作系统后门,泛指绕过目标系统安全控制体系的正规用户认证过程来维持对目标系统的控制权及隐匿控制行为的方法。

e.g. 粘滞键后门、注册表注入后门、计划任务后门、meterpreter后门、Cymothoa后门、WMI型后门

粘滞键,5次shift,其实就是命令替换,解决无法同时按多个按键的问题,如将粘滞键设置为ctrl+p,因此可以调用cmd、执行后门程序、反弹脚本等。

在普通用户权限下可以将后门程序或脚本路径填写到启动项注册表中,当系统管理员登录系统时触发后门。

计划任务在Windows7及之前使用at,在Windows8开始使用schtasks。计划任务后门分为管理员权限和普通用户权限两种。可利用Metasploit、PowerSploit、Empire。

meterpreter后门,metsvc(依靠服务)和persistence(依靠启动项),参考1

Cymothoa是一款可以将ShellCode注入现有内存(即插进程)的后门工具。

WMI型后门需要管理员权限。主要使用了WMI的两个特征,即无文件和无进程。原理:将代码加密存储于WMI中,达到所谓的“无文件”;当设定的条件被满足时,系统将自动启动PowerShell进程去执行后门程序,执行后,进程消失,达到所谓的“无进程”。

Web后门

WebShell

域控制器权限持久化

e.g. DSRM域后门、SSP维持域控权限、SID History域后门、Golden Ticket、Silver Ticket、Skeleton Key(万能密码)、Hook PasswordChangeNotify

在渗透测试过程中,如果发现系统中存在恶意行为,应及时更改域管理员密码,对受控机器进行断网处理,然后进行日志分析和取证。

利用系统功能

DSRM(Directory Services Restore Mode,目录服务恢复模式)是Windows域环境中DC的安全模式启动选项。每个DC都有一个本地管理员账户(也就是DSRM账号)。DSRM的用途是:允许管理员在域环境中出现故障或崩溃时还原、修复、重建活动目录数据库,使域环境的运行恢复正常。在域环境创建时,DSRM的密码需要在安装DC时设置,且很少会被重置。因此可以使用ntdsutil工具同步krbtgt的NTLM Hash(即修改密码),再利用注册表修改DSRM的登录方式,即可使用PTH来实现权限持久化。

防御:定期检查注册表中用于控制DSRM登录方式的键值、定期修改密码、WAF检查操作日志等。

SSP(Security Support Provider)是Windows安全机制的提供者,就是一个DLL文件,主要用来实现Windows的身份认证功能,如NTLM、Kerberos等。如果获得了网络中目标机器的System权限,可以使用该方法进行持久化操作。

主要原理:LSA(Local Security Authority)用于身份验证;lsass.exe作为Windows的系统进程,用于本地安全和登陆策略;在系统启动时,SSP将被加载到lsass.exe进程中。但是,假如攻击者对LSA进行了扩展,自定义了恶意的DLL文件,在系统启动时将其加载到lsass.exe进程中,就能够获取lsass.exe进程中的明文密码,这样即使用户更改的密码并重新登陆,依然可以获取。

e.g. mimikatz misc::memssp和mimilib.dll

SID的作用主要是跟踪安全主体控制用户链接资源时的访问权限。SID History是在域迁移过程中的一个属性,如果迁移后用户的SID改变了,系统会将其原来的SID添加到迁移后用户的SID History属性中,使迁移后的用户保持原有权限、能够访问其原来可以访问的资源。如果获取了域管理员权限,可以将SID History作为实现持久化的方法。如将Administrator的SID添加到恶意用户test的SID History属性中。

e.g. mimikatz sid::add

PTT 伪造票据

Golden Ticket 黄金票据:

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

PTT需要:目标域管理员用户名、完整的域名、域SID、krbtgt的NTLM Hash或AES-256值。

大致步骤:导出krbtgt的NTLM Hash(mimikatz lsadump::dcsync利用VSS远程转储AD的ntds.dit)、获取基本信息(域SID wmic useraccount、当前用户SID whoami /user、域管理员账号 net group、域名 ipconfig /all)、清空票据(mimikatz kerberos::purge)、生成票据(kerberos::golden,利用NTLM Hash,AES-256同理)、传递票据并注入内存(kerberos::ptt)、检索当前会话中的票据(kerberos::tgt)、验证权限(dir \\dc\c$)

防御:管理员通常会修改域管理员的密码,但有时会忘记将krbtgt密码一并修改。

使用Golden Ticket伪造的用户可以是任意用户(即使这个用户不存在)。因为TGT的加密是由krbtgt完成的,所以,只要TGT被krbtgt账户和密码正确的加密,那么任意KDC使用krbtgt将TGT解密后,TGT中的所有信息都是可信的。

Silver Ticket 白银票据:

Golden Ticket使用krbtgt账号的密码散列值,利用伪造高权限的TGT向KDC要求颁发拥有任意服务访问权限的票据,从而获取DC权限。而Silver Ticket会通过相应的服务账号来伪造TGS,例如LDAP、MSSQL、WinRM、DNS、CIFS等,范围有限,只能获取对应服务的权限。

Golden Ticket是由krbtgt账号加密的,而Silver Ticket是由特定的服务账号加密的。

PTT需要:域名、域SID、目标服务器的FQDN、可利用的服务、服务账号的NTLM Hash、需要伪造的用户名。

其他方法

Skeleton Key(万能密码),在DC中以域管理员权限使用mimikatz在lsass.exe进程注入Skeleton Key(misc::skeleton),就可以以域内任意用户的身份,配合该key(默认密码mimikatz)进行域内身份授权验证。

mimikatz首先使用privilege::debug提升权限到Debug权限,才能与lsass交互。2014年微软增加了LSA保护策略,防止lsass.exe进程被恶意注入。

防御:强口令、双因子认证、应用启动白名单等。

Hook PasswordChangeNotify,当用户修改密码后在系统中进行同步的同时抓取输入的明文密码。

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