2021年欧洲杯(www.x2w99.com)实时更新发布最新最快最有效的2021欧洲杯资讯。
密码破解的利器——彩虹表(rainbow table)
确定 shellcode 依赖于
彩虹表「biao」是一个预先盘算好的表,用于缓存加密哈希函数的输出,通常用于破解密码哈希。
以下 Python 代码段盘算位于最常见系统位置的 DLL 导出的“Metasploit”哈希值。
例如,下面的PowerShell下令天生一个彩虹表,然后搜索下图中首先考察到的726774Ch哈希值。为了利便人人「ren」,研究职员宣布了包罗 239k 哈希值的 Rainbow.csv 版本。
如上所述,shellcode剖析并挪用的第一个(ge)导入是LoadLibraryA,它由32位和64位kernel32.dll导出。
执行流程剖析
将导入剖析排序后,明白剩余的代码变得加倍容易。如下图所示,shellcode最先执行以下挪用:
在㉗处LoadLibraryA确保ws3_32库加载,若是还没有加载,它将映射内存中的ws3_32.dll DLL,使shellcode能够进一步剖析与Windows Socket 2手艺相关的附加函数。
在㉙处,WSAStartup在 shellcode 的历程中启动套接字的使用。
WSASocketA 在㉙处确立一个新的套接字,这将是一个基于流(SOCK_STREAM)的IPv4套接字(AF_INET)。
套接字初始化的反汇编
确立套接字后,shellcode 继续挪用 ㉝ 处的毗邻函数,并使用先前进入客栈 (㉜) 的 sockaddr_in 结构。 sockaddr_in 结构包罗从事宜响应角度看的有价值的信息,例如协议(0x0200 是 AF_INET,又名 IPv4,小端)、端口(0x115c 是大端的默认 4444 Metasploit 端口)以及 C2 IPv4 地址㉛(0xc0a801ca 在大字节序中是 192.168.1.202)。
若是毗邻失败,shellcode 最多重试 5 次(在 ㉞ 处界说的计数器在 ㉚ 处递减),之后它将使用 ExitProcess (㉟) 中止执行。
若是毗邻乐成,shellcode 将确立一个新的 cmd 历程并将“jiang”其所《suo》有的尺度错误、输出和输入(㊱)毗邻到已确立的 C2 套接字。历程自己【ji】是通过 ㊲ 处的 CreateProcessA 挪用启动的。
逆向shell
最后,当历程运行时,shellcode执行以下操作:
通过挪用 WaitForSingleObject 在 ㊳ 处无限期守候远程 shell 终止;
终止后,使用 GetVersion 在 ㊴ 处识别 Windows 操作系统版本,并使用 ExitProcess 或 RtlExitUserThread 在 ㊵ 处退出;
终止shellcode
总的来说,Metasploit 的 windows/shell_reverse_tcp shellcode 的执行流程架构如下:
Metasploit的TCP逆向shell执行流
Shellcode被中止
在完成了执行流剖析之后,让我『wo』们看看若何在 shellcode 上打开表格并损坏它。从攻击者的角度来看,shellcode 自己被以为是可信的,而它运行的环境是被污染的。本节将假设研究职员不知道 shellcode 在内存中执行的位置,因此,挂钩/修改 shellcode 自己不是一个可接受的解决方案。
接下来,我们在先容看法验证实现之前,会首先先容一些理论方面的内容。
CWE-1288:输入一致性验证欠妥
当吸收一个包罗多个元素或字段的庞大输入时,这些元素或字段必须相互一致,但它不验证或不会很准确地验证输入是否现实一致。
从shellcode的角度来看,只有两个外部交互提供了一个可能的攻击面。第一个也是最显著的外面是C2通道,在这个通道中,一些平安剖析方案可以检测/削弱通讯协议或周【zhou】围的API挪用。然而,这种攻击外面有大量的忠告,平安剖析方案必须区分正当和恶意行为,可能会导致一些中等/低置信度的检测。
第二个不太显著的攻击面是导入剖析自己,从shellcode的角度来看,它依赖于外部历程数据。在这个导入剖析例程中,研究职员考察到 shellcode 若何依赖 BaseDllName 属性为每个模块天生哈希。
哈希例程检索Buffer和MaximumLength以哈希模块的BaseDllName
虽然模块的导出是以 UTF-8 NULL 末尾的字符串,但 BaseDllName 属性是一个 UNICODE_STRING 结构。此结构包罗多个属性:
Length:存储在Buffer中的字符串的长度,以字节为单元;
MaximumLength:缓冲区的长度,以字节为单元;
缓冲区:指向用于包罗宽字符字符串的缓冲区的指针;
……
若是字符串以null末尾,Length不包罗末尾的空字符。
MaximumLength 用于指示 Buffer 的长度,以便在将字符勾转达给 RtlAnsiStringToUnicodeString 等转换例程时,返回的字符串不会跨越缓冲区巨细。
虽然上文没有明确提到,但我们可以隐约地感受到缓冲区的MaximumLength属性与现实字符串的Length属性无关。Unicode字符串不需要消耗整个Buffer,也不能保证以null竣事。理论上,Windows API应该只思量Buffer的第一个Length字节举行对照,忽略Length和MaximumLength位置之间的任何字节。增添UNICODE_STRING的缓冲区(buffer和MaximumLength)不应该影响依赖于存储字符串的函数。
由于shellcode的哈希例程依赖于缓冲区的MaximumLength,差异巨细的缓冲区中的类似字符串将天生差其余哈希。哈希例程中的这个破绽可以用来消除潜在的Metasploit shellcode。从手艺角度来看,由于平安解决方案已经挂钩历程确立并自我注入,因此可以通过增添 Metasploit 所需模块的 BaseDllName 缓冲区(例如:kernel32.dll)来在不知道其存在或位置的情形下滋扰哈希例程。
研究职员接下来将行使这个哈希输入验证破绽作为初始向量来导致拒绝服务和执行流挟制。
CWE-823:使用超出局限的指针偏移
该程序对有用指针执行指针运算,但它使用的偏移量可以指向效果指针的预期有用内存位置局限之外。
研究职员之前所{suo}做的一个考察是 shellcode 若何无限循环模块,直到找到匹配的导出。当他们发现一个改变哈希值的破绽时,就试着剖析若是所有哈希值都不匹配会发生什么情形。
当遍历双链表可以无限循环时,shellcode将在检查所有模块后现实天生一个“Access Violation”错误。此异常不是由shellcode天生的,而是由于代码没有验证列表的界限而发生的。鉴于对于列表中的每个项目,BaseDllName.Buffer 指针都是从偏移量 0x28 加载的,一旦研究职员接见列表中的第一个非 LDR_DATA_TABLE_ENTRY 项目,就会发生异常。如下图所示,一旦 shellcode 循环回到第一个 PEB_LDR_DATA 结构,就会泛起这种情『qing』形,在这个阶段会发生越界读{du}取,导致无效指针被作废引用。
2022世界杯预选赛越南赛程(www.9cx.net)实时更新比分2022世界杯预选赛越南赛程数据,2022世界杯预选赛越南赛程全程高清免费不卡顿,100%原生直播,2022世界杯预选赛越南赛程这里都有。给你一个完美的观赛【sai】体验。
遍历InMemoryOrderModuleList双链表时的越界读取
虽然从防御的角度来
滥【lan】用CWE-1288挟制执行流
我们感兴趣的一个模块是kernel32.dll,正如之前在“执行流剖析”部门所剖析的,它是挪用 LoadLibraryA 函数所需的第一个模块。在哈希例程中,kernel32.dll哈希被盘算为0x92af16da。通过应用上述缓冲区调整手艺,研究职员可以确保 shellcode 循环附加模块,由于原始哈希不会匹配。至此,平安解决方案有几个 ge[选项:
研究职员注入的平安剖析方案的DLL可以命名为kernel32.dll。虽然它的哈希值是匹配的,但两个名为kernel32.dll的模块可能会对LoadLibraryA的正当挪用发生意想不到的结果。
有两个名为 kernel32.dll 的模块可能会对 LoadLibraryA 的正当挪用发生意想不到的结果。
同样,由于研究职员已经在 LDR_DATA_TABLE_ENTRY 结构中修改缓冲区,但却可以轻松保留 kernel32.dll 缓冲区的原始值并将它们分配给研究职员的平安解决方案的注入模块。虽然这在理论上可行,但如上所述,在内存中有一个被称为kernel32.dll的第二个缓冲区,这很容易引起运行风险。
另外,研究职员的平安解决方案的注入模块可以有差其余名称,只要与原始“shi”哈希存在哈希冲突。这种手艺不会影响诸如 LoadLibraryA 之类的正当挪用,由于它们依赖于基于值{zhi}的对照,而不是 shellcode 的基于哈希的对照。
研究职员之前考察到 Metasploit shellcode 若何使用 ASCII 字符(1 字节)的添加和旋转来执行哈希。以下模式形貌了 KERNEL32.DLL 在第三个循环中的哈希状态,其(qi)中 ASCII 字符 K 和 E 重叠。可以看到,NULL字符是对最初是Unicode字符串(2字节)的字符串执行1字节操作的直接效果。
第一个和第三个ASCII字符重叠
为了获得哈希冲突,研究职员需要识别在不改变效果哈希的情形下对初始KERNEL32.DLL字符串所执行的更改。下图强调了第一个和第三个ASCII字符之间的6位关系。通过减去第一个字符的第二位,我研究职员可以增添第三个字符的第八位(2+6),而不影响获得的哈希值。
第一个和第三个ASCII字符之间的哈希冲突
虽然上面的冲突是不现实的(ASCII或Unicode字符0xC5不在字母数字局限内),但研究职员可以应用相同的原则来识别可接受的关系。假设研究职员不改变字符串的长度,以下 Python 代码片断会暴力破解 KERNEL32.DLL 字符串的 Unicode 字符之间的关系。
如上所述,可以修改多个字符对以导致哈希冲突。例(li)如,在Unicode位置0和11处的字符之间存 cun[发生了 2 位左移。
若是左移2位类似于乘以 4的效果,则位置 0 处的 Unicode 字符增添任何值都需要将位置 11 处的字符削减 4 倍相同的值,以保持 Metasploit 哈希稳固。以下 Python 下令突出显示了 KERNEL32.DLL 的这两个字符之间的差异组合。
这种哈希冲突‘tu’与缓冲区调整巨细手艺相连系,可以链接起来,以确保研究职员的自界说 DLL 在哈希例程中作为KERNEL32.DLL举行盘算。现在,若是研究职员导出 LoadLibraryA 函数,则Metasploit 导入剖析将错误地挪用研究职员的实现,从而导致执行流程挟制。可以行使此挟制向平安解决方案发出高置信度 Metasploit 导入剖析发生的信号。
看法证实
为了验证上述理论,首先需要构建一个看法验证 DLL,一旦加载,它将使用 CWE-1288 来模拟 EDR(终端检测和响应)解决方案若何在不知道其内存位置的情形下检测 Metasploit,不外为了行使上述哈希冲突,研究职员的 DLL 将被命名为 hernel32.dlx。
该看法验证现在已经宣布在NVISO的GitHub存储库中了。
历程注入
为了模拟平安剖析方案若何被注入到大多数历程中,让我们构建一个简朴的函数,它将在我们选择的历程中运行研究职员的 DLL。
Inject函数将诱使目的历程加载一个特定的DLL(研究职员的hernel32.dlx)并执行其 DllMain 函数,研究职员将在此处触发缓冲区巨细调整。虽然存在多种手艺,但我们只需将DLL的路径写入目的历程,然后确立一个挪用LoadLibraryA的远程线程即可。最后这个远程线程将加载我们的DLL,就像目的历程一样。
可能有人会注重到,上面的代码依赖于hPayload变量。这个变量将在DllMain函数中界说,由于研究职员的目的是获适合前DLL的模块,而不管其名称若何〖he〗,而 GetModuleHandleA 将要求研究职员对 hernel32.dlx 名称 cheng[举行硬编码。
导出 Inject 方式后,研究职员现在可以继续构建触发 CWE-1288 所需的逻辑。
缓冲区巨细调整
可以使用以下逻辑完成从 kernel32.dll 模块调整 BaseDllName 缓冲区的巨细。与 shellcode 的手艺类似,研究职员将恢复 PEB,遍历 InMemoryOrderModuleList,一旦找到 KERNEL32.DLL 模块,将其缓冲区增添 1。
最幸亏注入发生后尽快触发此逻辑,虽然这可以通过TLS钩子来完成,但为了简朴起见,研究职员将更新现有的 DllMain 函数以在 DLL_PROCESS_ATTACH 上挪用 Metasplop。
剖析的shellcode只有依赖于LoadLibraryA,才气使构建得以实现,它将简朴地发出Metasploit警报,然后终止当前的恶意历程。下面的函数只会被shellcode触发,它自己不会从研究职员的 DLL中被挪用。
上述方式可以用于其他变体,如LoadLibraryW、LoadLibraryExA和其他变体。
准备好模拟平安解决方案后,就可以继续演示了。现在将首先执行 Shellcode.exe,这是一个简朴的 shellcode 加载程序(如下图所示)。这个 shellcode 加载程序提到它的{de}历程ID(研究职员将其作为注入的目的),然后守候它需要执行的 shellcode 路径。
一旦我们知道shellcode在哪个历程中运行,我们就可以注入模拟的平安剖析方案(如下图的右侧所示)。此历程通常由每个历程的平安解决方案执行,为了简朴起见,仅在研究职员的 PoC 中手动完成。使用研究职员的自界说 DLL,我们就可以使用以下下令注入所需的历程,其中 hernel32.dlx 的路径和历程 ID 已举行了匹配。
手动模拟未来恶意历程的注入
执行注入后,Shellcode.exe 历程已被暂存(调整模块缓冲区巨细,加载冲突 DLL),以便在任何 Metasploit shellcode 运行时行使 CWE-1288 破绽。值得注重的是,在此阶段,没有加载任何 shellcode,也没有为其分配任何内存。这就确保了我们遵守了研究职员不知道 shellcode 在那里执行的假设。
注入研究职员的模拟平安解决方案后,我们可以继续向即将成为恶意的 Shellcode.exe 历程(下图的左侧)提供初始天生的 shellcode(在研〖yan〗究职员的示例中为 shellcode.vir)的路径。
执行由 stager 执行的恶意 shellcode
一旦shellcode运行,我们就可以在下图中看到若何挪用LoadLibraryA信号函数,从而对基于shellcode的导入分辨率举行高置信度检测。
将输入验证破绽和哈希冲突链《lian》接起来向杀毒软件发出信号
总结
本文重点先容了Metasploit shellcode的剖析,并着重先容了动态导入剖析。在这个动态导入剖析方案中,我们又发现了两个破绽,其中一个可以用来准确识别运行时Metasploit shellcode。
本文翻译自:https://blog.nviso.eu/2021/09/02/anatomy-and-disruption-of-metasploit-shellcode/新2登陆网址(www.x2w333.com)实时更新发布最新最快的新2手机网址、新2手机网址线路、新2手机网址登录网址、新2手机网址管理端、新2手机网址手机版登录网址、新2手机皇冠登录网址。ag区块链百家乐声明:该文看法仅代表作者自己,与www.allbetgame.us无关。转载请注明:Metasploit天生的Shellcode的导入函数剖析以及执行流程剖析(下)
联博单纯觉得好看
忠粉有奖励吗
更好一点也不是问题
vivoU3正面回收了一块6.53英寸的水滴周全屏,在满足现代用户追求的超大视野的同时,19.5:9的修长比例,也带来了更为舒适的握持感。在观感上,2340*1080的判别率细腻水平与主流产物险些一致,而云云周全屏的设计,也为vivoU3带来了90.3%的屏占比,纵然周全屏已经普及了许久,但在看到vivoU3时,眼球照旧会被其所深深吸引。内容很优