样本中的CryptAPI

VSole2021-09-28 21:50:59

0x00 CryptAPI的概述

一个CSP是实现加密操作的独立模块,要实现加密,至少需要一个CSP。每个CSP对CryptAPI的实现是不同的,使用的算法不同,有些包含了对硬件的支持

  • CryptAcquireContext 获得指定CSP的密钥容器的句柄
  • CryptReleaseContext释放得到的句柄

在此前提下相关的函数如下

  • CryptDeriveKey 从一个密码中派生一个密钥
  • CryptDestoryKey 销毁密钥
  • CryptDuplicateKey 制作一个密钥和密钥状态的精确复制
  • CryptGenKey 创建一个随机密钥
  • CryptImportKey 把一个密钥BLOB传送到CSP中

用来加解密数据,需要指定一个密钥,这个密钥可以是由CryptGenKey、CryptDuplicateKey、CryptImportKey产生。

  • CryptEncrypt 使用指定加密密钥来加密一段信息
  • CryptDecrypt 使用指定加密密钥来解密一段密文

完整的解密过程如下

#include #include #pragma comment (lib, "advapi32")int main(){    HCRYPTPROV hCryptProv;    HCRYPTHASH hCryptHash;    HCRYPTKEY hCryptKey;
    CryptAcquireContext(&hCryptProv,            // CSP句柄的指针                        NULL,                   // 密钥容器名称                        MS_DEF_PROV,            // CSP名称(如果为NULL,就使用默认的CSP)                        PROV_RSA_FULL,          // CSP类型                        CRYPT_VERIFYCONTEXT);   // 此选项指出应用程序不需要使用公钥/私钥对
    CryptCreateHash(hCryptProv,     // CSP句柄                    CALG_MD5,       // Hash算法的标识符                    0,              // 如果哈希算法是密钥哈希,如HMAC或MAC算法,就用此密钥句柄传递密钥                    0,              // 保留,必须为0                    &hCryptHash);   // 哈希对象的句柄指针
    static char szPassword[] = "FSD@#fds23"; // 加密密码    DWORD dwLen = strlen(szPassword);
    // 计算密码的Hash值    CryptHashData(hCryptHash,                    (BYTE*)szPassword,                     dwLen,                    0);
    // 根据密码的Hash值派生一个密钥    CryptDeriveKey(hCryptProv,      // CSP句柄                    CALG_RC4,       // 要产生密钥的对称加密算法                    hCryptHash,     // 哈希对象的句柄                    0,              // 密钥类型                    &hCryptKey);    // 输出密钥句柄指针
    // 待加密数据    static char szData[] = "important data";
    DWORD dwLenIn = strlen(szData);    DWORD dwLenOut = dwLenIn;
    CryptEncrypt(hCryptKey,         // 密钥句柄                0,                  // 如果在加密的同时需要计算Hash值,传入一个Hash对象句柄                TRUE,               // 标识是否是最后一次加密操作                0,                  // 保留,必须为0                (BYTE*)szData,      // 要被加密的数据                &dwLenOut,          // [in/out] 传入需要加密的数据长度,传出已经加密的数据长度                dwLenIn);           // 指出szData的Buffer长度
    CryptDecrypt(hCryptKey,         // 秘钥句柄                0,                  // 如果在加密的同时需要计算Hash值,传入一个Hash对象句柄                TRUE,               // 标识是否是最后一个解密操作                0,                  // 保留,必须为0                (BYTE*)szData,      // [in/out] 需要解密数据的地址                &dwLenOut);         // [in/out] 传入需要解密的数据长度,传出已经解密的数据长度
    // 清理工作    CryptDestroyKey(hCryptKey);    CryptDestroyHash(hCryptHash);    CryptReleaseContext(hCryptProv, NULL);

0x01 样本中的使用情况

该样本是某组织使用的最新的shellcode,该shellcode先获取计算机名,然后通过计算机名来获得IP地址,最后通过IP来计算hash和秘钥并对下一阶段的shellcode进行解密

具体过程如下

shellcode通过getComputerNamew和GetAddrInfow来获取IP信息,通过遍历addrinfoW链表来获取IP(打码部分为16进制IP地址),经过一次and操作后存入内存,待后续计算hash使用

计算并提取hash的过程如下

  1. 创建hash对象CryptCreateHash 
  2. 通过上面的16进制IP计算hash CryptHashData
  3. 查询hash长度CryptGetHashParam(HPHASHSIZE)
  4. 查询hash值CryptGetHashParam(HPHASHVAL)

其他获取CSP和destroy hash以及释放CSP的常规操作就不多说了

然后用IP的hash值进行拼接,复制到内存中(栈中)组合成key blob.通过CryptImportKey将其导入CSP中,设置以初始向量模式进行解密,将旧shellcode中待解密的部分复制到新内存中,用CryptDecrypt解密

最后还会对解密后的下一阶段shellcode再算一次hash

把这个算出的hash和旧shellcode中存的hash做比较,相同就创建线程去执行下一阶段shellcode

0x02 参考

https://nixwang.com/2013/04/18/windows-cryptoapi/

初始向量模式 https://blog.csdn.net/Vieri32/article/details/48345023)https://blog.csdn.net/weixin45303938/article/details/109012292

csphash函数
本作品采用《CC 协议》,转载必须注明作者和本文链接
样本中的CryptAPI
2021-09-28 21:50:59
通过一个样本来分析一波CryptAPI的使用流程
看程序图标是个mfc的程序,先打开看看,随便输入一点东西,看到弹窗弹出:直接拖进ida搜索Wrong!!!字符串,借此通过查看引用跳转到主函数
半个月前发布了xscan扫描器,这期间又针对很多场景进行了优化,本文来做一个总结。基于dom相似度的爬虫获取数据集的一个重要方式就是爬虫,开源爬虫中比较好的有projectdiscovery的katana和 crawlergo。此时在之前payload基础上加一个引号,就能破坏原有结构,此时asdsda经过语义分析后,属性为 Attribute的name,语义发生了改变,则说明可以XSS了。对url每层路径也进行一下检测,也能发现很多XSS。真实世界有趣的XSS国外也有个xss扫描器叫knoxss,它的测试用例不错,覆盖了很多场景。
在BlackHat21中,Specterops发布了Active Directory Certificate Services利用白皮书。尽管ADCS并不是默认安装,但在大型企业域中通常被广泛部署。 本文分为上下两篇,结合实战,讲述如何在域环境中利用ADCS手法拿下域控,哪些对象ACL可用于更好的权限维持,并涉及ADCS的基础架构、攻击面、后利用等。
每个黑客都会遇到这个,第一个赏金。我实际上无法解释它的感觉,但我知道你们中的大多数人都能理解它的感觉。当我们开始在 Web 应用程序安全中进行漏洞赏金时,我们大多数人都会从 XSS开始,故事从这里开始。
基于chrome的谷歌浏览器的一个漏洞将允许攻击者绕过网站上的内容安全策略(CSP),以窃取数据和执行恶意代码。 据PerimeterX网络安全研究人员Gal Weizman称,该漏洞(CVE-2020-6519)存在于Chrome, Opera和Edge,以及Win...
cspparse是一款针对内容安全策略的升级工具,在该工具的帮助下,广大研究人员可以针对自己所实施的内容安全策略CSP进行安全审计和评估。该工具使用了Google的API来获取CSP Header,并将获取到的信息以ReconJSON格式返回给研究人员。除此之外,该工具还能够解析目标站点的HTML,并检索HTML代码中标签包含的内容安全策略CSP规则。
公有云安全基于责任共担模型,将云服务提供商的角色(保护平台)与客户的角色(保护其在云中的资产)一刀切开,泾渭分明。这听起来不错,但在实践中,当CISO与某一个云供应商打交道时,责任共担模型可能会很棘手,而且在多云世界中难度还会成倍增加。
多个漏洞会影响Cisco的Video SurveMonitoring 8000系列IP摄像机,并可能允许与易受攻击的摄像机位于同一广播域的未经验证的攻击者使其脱机。第二个高严重性建议涉及一个特权升级漏洞,该漏洞影响了Cisco Smart Software Manager On-Prem或SSM On-Prem。在内部测试期间,Cisco发现经过身份验证的远程攻击者可以提升其特权,并以更高的特权执行命令,直至具有管理角色,从而使攻击者可以完全访问设备。在修补关键和高严重性漏洞的同时,该公司还发布了修复程序,以解决另外21个中等严重性漏洞。
2020 Codegate Web题解
2022-07-07 08:09:51
Codegate 还是有很多国际强队参加的,这里记录 Codegate 的两道 Web题。
VSole
网络安全专家