网络安全是互联网永不过期的主题,尤为是在云计算时代,大量的计算机应用迁移到云端,庞大的IT资产集结在云数据中心,一旦云数据中心爆发安全险情,轻则大量服务停摆,重则敏感数据丢失、系统遭到破坏,损失不可估量。国内几大头部云服务提供商,近一年都发生过网络运行或安全事故,抛开经济损失不提,做为顶级IT巨头出现安全问题不免尴尬,授人以柄、影响声誉。docker
本文讲述今天发生的一块儿黑客入侵事件,网络红客与黑客攻防对战。做者带您一步步揭开黑客攻击计算系统的内幕,也讲述网络红客如何绝地反击。浏览器
黑客身手不俗,深夜凌晨悄然侵入云服务器,步步为营,沿路设置重重障碍,就像冷兵器时代的铁蒺藜、铁拒马洒满一路,设下重重机关,牵一发而动全身,维系木马程序存在。安全
然并卵非也,魔高一尺,道高一丈。咱们想象中,网络红客高举网安利剑,直入特洛伊城,层层深刻,抽丝剥茧,把黑客设下铁蒺藜一根根拔出,轻松拆解隐秘机关,最后堵上城防漏洞,恢复城市的健康和生机。这里的特洛伊城就是中招的云服务器。还可能留下一具木马僵尸标本,以供未来拆解、把玩。哈哈!服务器
事实果然如此吗?网络
闲话少叙,咱们直奔主题,欣赏一场红客、黑客攻防战的前因后果和惊险场景。多线程
从这个例子也感悟到,咱们觉得的真相其实只是表象,看到的表象是更浅显的表象。就像俄罗斯套娃,一层套一层,不到最后一刻永远不知道是否抵达真相。架构
最近一个月,同事们抱怨公司JIRA服务器变慢了,并且愈来愈慢,点击页面几秒才有响应,几我的同时点页面,圆圈能不能转出来看运气。最近我忙着作K3s系统迁移,对JIRA没有太在乎,也没有关注PR和缺陷报告。curl
直到昨天,发现软件产品的有个页面不符合我带有洁癖的审美,小伙伴们怂恿我提交一条PR,我才去打开久违了的JIRA首页。没想到JIRA不给力,点登陆后圆圈转啊转啊,就是不出来工做台。还不给面子,报告帐号密码错。换Chrome浏 览器登陆,仍是帐号、密码错。个人帐号、密码是记在电子本本上的,排除人为因素,仅仅拷贝是不可能出错的。工具
那个无限旋转的圆圈,一点点消磨个人耐心。圆圈能不能求得圆满,以致于怀疑人生。哈哈。阿里云
此路不通,可否择歧路而行?用安全邮箱修改JIRA密码后,再登陆圆圈消失了,正常登陆进去。而后,一波未平一波又起,新建PR页面,出现白屏几分钟无响应。
此间不明必定有暗鬼。
小伙伴们的无助和个人切肤之痛,激发了个人好奇心和正义感。
明知山有虎,偏向虎山行。我不入地狱谁入地狱。
人不可雀语,语雀愿助人。语雀耳语于我,告知JIRA的帐号密码和访问路径。JIRA服务器架设在阿里云数据中心,云端SSH直连通道关闭,只能用堡垒主机做跳板二次登陆才能访问JIRA服务器。架设JIRA的人士用心于安全可谓良苦。
前奏有点慢节奏,不过某国大片不常常是这样的开头的吗,平静的生活危机四伏。
系统响应慢,习惯性地先看系统资源利用状况。输入top命令,一看吓一跳,有一个sd-pam进程占用CPU接近400%。
图 JIRA服务器系统资源利用状况
输入htop命令进一步查看详情。
图 JIRA服务器系统资源利用详情
从详情页可见,这台云服务器一共有4个CPU核心,4个核心利用率全是100%。可怜的JIRA(Java)进程挤到不知道哪一个犄角旮旯里去了,分配的CPU连1%都不到,难怪JIRA会慢得像蜗牛。
CPU利用率排在前5位(1+4)的进程无一例外是sd-pam,第1个进程CPU利用率是396%,紧接着4个进程CPU利用率在99%左右。
你们可能会问,4个核心的主机,5个进程CPU利用率加起来将近800%,怎么像8个核心呢?
Linux是多进程多线程的操做系统,以进程模拟线程,5个进程ID(PID),其实只有一个主进程,其他4个是进程模拟出来的线程,从属于主进程,4个线程的CPU利用率合计等于第1个线程的CPU利用率396%,不要重复计算。
sd-pam进程像疯狂的野兽吞噬着CPU。去研发大群里询问,没有人能说清楚sd-pam进程是什么来头。疑云骤起,关注点向sd-pam进程聚焦。
提交PR还得仰仗JIRA服务,JIRA服务是运行在Docker容器内的。登陆到JIRA容器,查看Java虚拟机参数,堆空间最大可用缺省值是768MB,对于JIRA服务来讲显然偏低。而云服务器16GB内存还有10GB以上的空闲,闲着也是闲着,堆空间最大可用值拟修改成2GB。由于运行环境和文件权限问题,在容器内很差修改文件,因此用docker cp命令把环境设置文件setenv.sh拷贝到宿主机,修改后拷贝回JIRA容器。
在大群里喊一嗓子,要重启JIRA服务了,没人理,过几分钟就reboot云服务器了。
重启后,JIRA服务的配置会生效,JVM堆空间会扩大,对改善JIRA服务会有帮助。我也想看看云服务器重启后,sd-pam进程会不会还在。
修改JIRA配置与黑客对战没啥关系,不过是举手解JIRA之困境。
重启云服务器后,sd-pam进程依然顽固地存在,撒着欢同样把CPU利用率拱到满格400%。
“你来或不来我都在这里,很少很多,4个CPU全是个人菜。” 清哥哥感受被挑衅了,看来得好好伺候这位爷了。
思绪开始往木马、蠕虫方向去想了。但凡木马都不是孤立的,要与外界联系,云服务器联系外界惟一的通道是网络通讯。我想看看sd-pam都联系了哪些网络地址。实用工具lsof能查看进程打开的全部文件描述符。文件描述符有点抽象,可是说创建的TCP链接、打开的文件/目录、创建的管道都是文件描述符,就不难理解了。而进程打开的文件和创建的TCP链接正是我想知道的,之后有妙用。
在CentOS上,缺省地没有安装实用命令lsof,经过yum自动下载安装。
1 yum install -y lsof
安装好之后火烧眉毛想看看sd-pam都干了啥。输入lsof命令,带参数-p PID,PID是进程ID。
1 # lsof -p 11320
图 sd-pam进程打开的文件描述符
分析命令输出,发现两个疑点:
第一个疑点是被删除的文件:/var/tmp/dbus/.sd-pam/sd-pam(deleted)。
第二个疑点是从本机链接到未知远端IP的TCP链接: jira-wiki-nexus:55916->128.199.136.211:http。
链接外网的TCP链接很常见,先从第二个未知TCP链接下手。这个TCP链接指向HTTP端口,用浏览器打开网址,页面显示Mining Proxy Online。Mining,不是Mine,不就是挖矿吗?它自我暴露了。
换一个Google Chrome访问网址看看,输出仍是Mining Proxy Online。
再试一试curl命令,都说在挖矿,很诚实的样子。
上午怼黑客时,并无注意到Mining这个词,只是猜想多是挖矿,要否则找个“肉鸡”干吗呢?
百度一下,看看IP来自何方。百度虽然有不少槽点,可是引入的IP查询工具仍是实用的。查询结果显示远端IP来自新加坡,是部署在海外的主机。而重启主机前的一次lsof显示,远端IP来自美国。以后,杀死过sd-pam不下十次,它又顽固地出现,稳定地链接这个新加坡IP地址。
接着,我想知道进程sd-pam的可执行程序藏身在什么地方。用了find命令去找它,执行时间太长,一时没耐住性子,ctrl+c掐断了。
好吧,先放过它。
进程sd-pam是可执行的,那么就能够用gdb来跟踪调试,深刻内部是否是能够窥探内幕。
CentOS缺省也没有安装程开源调试工具gdb,运行yum命令自动下载、安装gdb。
1 # yum install -y gdb
安装好之后,启动gdb,而后输入attach PID(PID须要替换为实际进程号),触碰sd-pam进程并挂载到gdb调试环境。输出显示/var/tmp/dbus/.sd-pam/sd-pam(deleted),该进程的可执行文件不存在。
消失的可执行程序,难道是挥刀删掉本身了吗?很诡异的现象。正常状况下,从可执行文件启动进程后,可执行文件依然存在原处。由于操做系统建立进程时,未必彻底加载可执行文件,可能分步加载,运行时仍可能从可执行文件读数据段。进程可否删除启动的可执行文件?此处存疑。
后续分析会揭露可执行文件消失的真相。
由于想要尽快定位故障、解决问题,gdb调试暂告一段落。
消失的可执行文件意味着sd-pam进程的主人不但愿可执行文件被发现,那么可执行文件可能隐藏着鲜为人知的秘密。sd-pam是黑客进程的疑虑进一步加剧。
经过百度或谷歌搜索关键字sd-pam,所得搜索结果不多,看起来有关联的搜索结果不过区区两三条,点进去看详情也绝不相干。若是黑客攻击一说成立的话,那么程序文件名是个性化量身定制的,一样的攻击程序在别的受攻击服务器,可 能会使用别的程序文件名。或者,也许这个攻击程序刚出现,没有造成规模和睦候,因此网上报告的信息较少。
可执行程序位于目录/var/tmp/dbus/.sd-pam/,这个目录有两个疑点:可执行目录包含tmp,在Windows安装程序时很常见,Linux 系统不多见;子目录.sd-pam是隐藏目录,命令ls -a才能显示出来,ls是看不出来的。目录的两个疑点都指向,sd-pam程序的主人试图掩盖什么,不想让所寄居的云服务器的管理人员发现。
尝试进入目录/var/tmp/dbus,有了新的发现:
1 # cd /var/tmp/dbus 2 3 # ls -ltra 4 5 # more sd-pam
竟然看到了sd-pam,不过sd-pam是一小段Shell脚本,用more命令查看文件内容:
这个脚本作了4件事:
S一、建立隐藏子目录.sd-pam。子目录与前面发现的可疑路径吻合。
S二、复制文件x86_64到隐藏子目录.sd-pam,并更名为sd-pam。与前面发现消失的可执行文件彻底一致。
S三、启动新复制的sd-pam程序,带有参数-h sd-pam -c。怀疑是以父子进程监控的方式启动:万一子进程死亡,父进程依然能fork出新的子进程。这样大大增长sd-pam程序存活的概率。
S四、删除S1建立的子目录.sd-pam,连同子目录下可执行文件sd-pam也一并删除。这就解释了前面的谜团:sd-pam进程存在,而进程的可执行程序文件却神秘地消失了。由于脚本sd-pam是以root用户身份运行的,删除jira用户运行进程的可执行文件毫无压力,无需提权。虽无根,仍运行。
注意:这里的sd-pam有两个同名版本:一个是Shell脚本sd-pam;另外一个是可执行文件sd-pam,由可执行文件x86_64复制、更名而来,不能混淆。
x86_64适用于64位的X86架构芯片,能够想象该程序可能还有x86(32位X86架构芯片)、ARM3二、ARM64和SPARC64等多种版本。
前面提到,JIRA云服务器从新启动后,sd-pam进程像幽灵同样存在,挥之不去,紧紧占据CPU排行榜的首位。应该是有某一种机制可以自动启动sd-pam。
已知的第一种机制是Linux后台服务管理,在系统从新引导后会自动运行,这是Linux内部机制,潜伏的进程只要不被发现,彻底能够长期潜伏、按期送出有价值的信息。
第二种机制就要复杂得多,来自互联网的漏洞扫描程序,定时扫描云服务器的漏洞,发现漏洞后从新植入木马。第二种机制容易受到网络安全屏障的阻隔,频繁的扫描也容易被网络安全嗅探器发现,主要的云计算中心都提供免费或收费的服务,嗅探、发现漏洞和外部攻击。因此第二种机制/方法,不适合监控已植入木马云服务器,更适合于初次寻找漏洞,或者地毯式搜索云服务器漏洞。
在不重启云服务器时,直接杀死sd-pam进程能快速的中止木马进程。Linux命令kill传递信号参数SIGKILL或者9能当即杀死进程。
1 # kill -9 11320
杀死进程后,CPU利用率当即降低到个位数。遗憾的是一两分钟后,sd-pam幽灵又出如今top命令输出榜首。
一两分钟内重启进程,Linux Service服务监控管理能作到,但又不符合其行为方式。由于杀死sd-pam进程后,服务监控进程当即能感知到,不会等待,而会当即重启新的sd-pam进程。
有另外一种Linux定时任务机制,能作到精准到时分,重启后台任务。Linux后台服务crond,定时被唤醒,按照crontab表定义的时间表启动后台任务。
先看看crontab的时间表:
1 # crontab -l 2 3 … 4 5 * * * * * /var/tmp/dbus/./x86_64
图 Crontab定时启动、检查进程sd-pam
又发现了x86_64的踪影。前面说到,x86_64就是sd-pam的化身和前身,sd-pam是x86_64的拷贝。自动忽略crontab表的第一条时间任务。
定时任务crontab的任务项由五个时间列和一个命令列组成。五个时间列分别是分钟、小时、星期、日、月,若是是数字表示具体时点,若是是*表示全部的时间点。
五个时间列都是*,表示每个月每日每星期每时每分,都会运行命令列的程序。翻译过来就是:7*24小时的每一分每一秒都在运行,榨干云服务器的每一分计算力。够狠的吧,比996厉害吧,669也不过如此。
x86_64能干什么,我有点好奇,忍不住手欠,运行了一把。反正CPU已经4个100了,也不会更坏了。
1 # x86_64
提示程序已经在运行。x86_64有自我监控的功能,只运行一份sd-pam进程副本。Crontab里的x86_64应该就是监控sd-pam存活状态的幕后推手。
先在最前面添加#号,注释掉crontab定时任务。斩断一双幕后黑手,那么木马程序sd-pam就会像孤儿同样。再杀了孤儿sd-pam,预期木马就会清除了。
1 # crontab -e
编辑并保存crontab,当即生效。
而后,执行kill -9 PID,果真sd-pam幽灵消失了好一下子。好一下子是多久,没读秒,没数数,我也不知道是多久。哈哈。
在完全击败敌人以前,欢乐的日子老是短暂的。过了好一下子,sd-pam幽灵又出现了。有些气馁了,怎么办?不过,尚未动绝杀以前,怎么能轻言失败呢?!
回顾一下,无论是Linux服务管理仍是Linux Crontab,都要调用/var/tmp/dbus/目录下的程序,那么让它们找不到这个目录,是否是它们就抓瞎了呢?说干就干,斩草要除根,dbus就是sd-pam的根。
1 # cd /var/tmp 2 3 # mv dbus dbus_bak 4 5 # kill -9 PID ## PID替换为sd-pam进程的进程号
这里没有直接删除dbus目录,而是给目录更名,使之找不到dbus目录,与删除目录效果是同样的。黑客攻击现场留下活证据,可做为呈堂证供。哈哈。
如此操做以后,幽灵进程再也没有出现过。又重启了云服务器,幽灵进程也没有出现了,空闲时CPU利用率稳定在个位数。
图 清除木马后云服务器进程列表
从浏览器点击JIRA控制台,在后台监控云服务器,看着JIRA(Java)进程欢快地吞噬CPU,我也长舒了一口,内心的石头落地了。
木马程序是被根除了,可是黑客是怎么攻进来的,云服务器漏洞在哪里,黑客会不会轻车熟路开始下一波攻击,咱们一无所知。若是您对此感兴趣,请看下一节。
下文预告: 四、探秘黑客踪 4.1 寓言公寓楼 4.2 查询访客志 4.3 孜孜找不一样 4.4 惊现无秘码 4.5 紧锁失密门 4.6 探寻黑客踪 4.7 解读黑客术 4.8 还原入侵图 五、修复云主机 六、安全警示钟 七、详解木马源 八、小结