`
jsczxy2
  • 浏览: 1270834 次
  • 性别: Icon_minigender_1
  • 来自: 常州
文章分类
社区版块
存档分类
最新评论

转载新闻 服务器被黑给我上了一课

阅读更多

当你作为一个独立开发者的时候总要面临这样那样的问题,以前认为的小概率事件也总是某个时间点蜂拥而至考验你的耐心,前一阵阵刚刚经历了一次木马惊魂 (参见文章猎豹清理大师值得我们信任么? ),这次又遇到了服务器被黑。 

部署服务器及一般的服务配置管理对于一个写代码的人自然不在话下,但是相对专业的运维人员程序员确少的却是一个安全意识,总以为服务器被攻击是一个小概率的事件。以前是这么考虑的“互联网上的主机那么多偏偏你的主机被骇客盯上? 这不跟重大奖一样么,我有那么幸运么?”虽然前一段时间自己的产品被当成木马已经是中了一次大奖了。所以心存侥幸心理,能省事就省事,先把服务部署起来能用就行,这也倒是符合我的极简主义行事风格。只有经历才能成长,这句话说的一点没错,感谢这个不太聪明的骇客给我上了一课,从此在做任何服务器部署和管理的时候我的脑袋里也多了一根弦儿“安全意识"。 事情是这样的。 
前几日像往常一样,访问我的产品网站http://xbrowser.me , 突然页面出现了404页面未找到。奇怪,怎么会这样?我有检查了一下输入的域名,没错确实是自己的网站。这时我心理突然一惊,倒吸一口冷气,莫非是因为前几天发布了一篇文章纪念我要废弃的产品功能-一键翻 墙 这么快就被GFW注意到了? 给我来了一个DNS劫持? 为了验证这一想法我马上打开了电脑的VPN程序,通过VPN再次访问我的网站(这样可以避免GFW的DNS劫持) 。网页呈现出来的依然是“404页面未找到”,这说明不是DNS劫持的问题,GFW并没有注意到我。这时候我不知道是喜还是忧,但是这究竟是什么原因造成的呢?为了查找真相我立刻登录了自己的服务器。 

首先我进入到了webserver根目录查看,果然看到网站文件被删掉了。还好我的程序有备份,这点损失我还是能够承受的,关键骇客的意图是什么呢?篡改主页?没有道理啊,对于我这个一没有知名度二没有影响力的小站点没有意义啊。好吧,不猜测原因了,这个哥们动作那么大我反而要庆幸,否则就凭我那点儿安全意识被当成肉鸡肯定毫无察觉。这时候我赶紧看看都有谁登录了服务器。 

引用

$ last | more 
chengkai pts/0        111.199.208.96   Mon May 18 14:41   still logged in   
chengkai pts/4        192.154.200.61   Mon May 18 12:39   still logged in   
chengkai pts/4        111.199.208.96   Sun May 10 02:40 - 14:39 (1+11:59)   
chengkai pts/4        111.199.208.96   Sat May  9 14:02 - 14:03  (00:00)    
chengkai pts/9        111.199.208.96   Sat May  9 00:15 - 02:31  (02:15) 


从日志上看,都是我自己的用户名,但是很明显有一个不一样的IP地址来源,我赶紧查了一下ip地址来源, 处理了北京网通的IP另外一个不同的IP来着台湾。很显然骇客已经攻破了我的root密码然后为了掩人耳目使用我的用户名进行线上操作,但是更让人惊愕的是此时这哥们竟然正在线上。 

引用

chengkai pts/4        192.154.200.61   Mon May 18 12:39   still logged in 


尼玛这真是大姑娘出嫁头一遭啊,这是要现场对决啊。第一闪念我要先把这下家伙给踢下去,可是又一想不行,这家伙已经拿到了我的root权限,被我踢下去很可能会气急败坏的重新登录破坏系统,还是先修改root密码及看看有没有留下什么后门再说,先看看对方有没有启动什么特殊的服务进程。 

引用

$ netstat -nl 


80、22、1723 这些端口是我知道的webserver,ssh和vpn。剩下的几个大端口号尤其值得怀疑。 

引用

Active Internet connections (only servers) 
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:1723            0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:48988         0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:52732         0.0.0.0:*               LISTEN 


那么接下来我用"lsof" 命令来看看这几个大的端口号是什么进程启动的? 

引用

lsof -i :48988 
ruby    13727 chengkai    9u  IPv4 98307068      0t0  TCP localhost:58185 (LISTEN) 
lsof -i  :52732 
ruby    18258 chengkai    9u  IPv4 97802878      0t0  TCP localhost:52732 (LISTEN) 


还好都是ruby进程,我猜想应该是passenger 转发http请求到rails的监听端口,为了证明我的猜想我停掉了nginx服务,果然ruby进程占用的端口号没有了。 

排除了骇客监听端口的嫌疑后,接下来看看会不会拿我的服务器当"肉鸡"使用,检测这一问题的最好办法就是查看外面的流量出口,这时候我想到了iftop命令。 

引用

$ sudo iftop -np 

                                   195kb                               391kb                              586kb                               781kb                          977kb 
└──────────────────────────────────┴───────────────────────────────────┴──────────────────────────────────┴───────────────────────────────────┴───────────────────────────────────
96.126.127.11:7000                                                          => 101.219.21.98:50726                                                         30.1kb  6.03kb  1.51kb 
                                                                            <=                                                                             1.12kb   230b     57b 
96.126.127.11:ssh                                                           => 111.199.216.183:63446                                                       5.09kb  5.91kb  6.13kb 
                                                                            <=                                                                              416b    291b    250b 
96.126.127.11:7000                                                          => 101.219.21.98:54488                                                         25.3kb  5.06kb  1.27kb 
                                                                            <=                                                                             1.12kb   230b     58b 
96.126.127.11:7000                                                          => 101.219.21.98:36312                                                         24.3kb  4.87kb  1.22kb 
                                                                            <=                                                                             1.12kb   230b     58b 
96.126.127.11:ssh                                                           => 222.186.21.250:56628                                                        5.20kb  2.61kb   668b 
                                                                            <=                                                                             3.14kb  1.44kb   368b 
96.126.127.11                                                               => 187.184.246.118                                                             8.39kb  3.65kb  3.65kb 
                                                                            <=                                                                                0b      0b      0b 
96.126.127.11:7000                                                          => 101.219.21.98:34993                                                         15.8kb  3.17kb   811b 
                                                                            <=                                                                             1.13kb   231b     58b 
96.126.127.11:7000                                                          => 103.254.203.177:58825                                                       8.54kb  1.71kb   437b 


在这里面,并没有发现什么异常的流量和往外的出口连接,又进行了一些常规检查,也没有发现特别异常的问题。 

引用

# 查看有无异常进程 
$ ps aux 
...... 
# 查看系统资源占用有无异常 
$ top 
...... 
# 有没有新增异常用户 
$ cat /etc/passwd 
...... 
#查看了root用户的命令历史记录,当然这个对稍有经验家伙是没有意义的,拿到了root权限后可以清理任何痕迹 
# history 
...... 


我知道接下来需呀做的两件事情,修改root及我当前用户的用户名密码及把入侵者踢下去。在修改了服务器的密码后,我在终端上输入了下面两个命令。 

引用

$ write chengkai pts/4 
what are you fuc king about 
#结束消息 
ctrl+d 
# 踢掉在线终端 
$ pkill -kill -t pts/4 


第一个命令是向入侵者发送一条信息“what are you fuc king about”,而第二条命令紧接着把入侵者踢了下去。这时候不免有了一丝满足感,可以想象对方收到消息并被我踢下终端时的表情,当然我想他可能不会这么容易善罢甘休。(其实我知道这种挑衅是蛮危险的,对方曾经拿到了root用户权限,如果在某个地方设置了一些后门会非常难以发现,系统很容易会被再次攻破)。 我打开了认证日志静静等待对方的再次破解登录,果然对方很快就来了,而且是发动了不同的主机进行ssh暴力破解。 

引用

$ sudo tail -f /var/log/auth.log 

Received disconnect from 222.186.21.243: 11:  [preauth] 
May 18 14:36:52 localhost sshd[16428]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.243  user=root 
May 18 14:36:54 localhost sshd[16432]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.243  user=root 
May 18 14:36:56 localhost sshd[16432]: Failed password for root from 222.186.21.243 port 56722 ssh2
May 18 14:37:01 localhost sshd[16432]: message repeated 2 times: [ Failed password for root from 222.186.21.243 port 56722 ssh2] 
May 18 14:37:01 localhost sshd[16432]: Received disconnect from 222.186.21.243: 11:  [preauth] 
May 18 14:37:01 localhost sshd[16432]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.243  user=root 
May 18 14:37:03 localhost sshd[16438]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.243  user=root 
May 18 14:37:05 localhost sshd[16438]: Failed password for root from 222.186.21.243 port 45780 ssh2
May 18 14::42:26 localhost sshd[18573]: Received disconnect from 222.186.21.244: 11:  [preauth] 
May 18 14::42:26 localhost sshd[18573]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.244  user=root 
May 18 14::42:29 localhost sshd[18579]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.244  user=root 
May 18 14::42:30 localhost sshd[18579]: Failed password for root from 222.186.21.244 port 38062 ssh2 
May 18 14::42:35 localhost sshd[18579]: message repeated 2 times: [ Failed password for root from 222.186.21.244 port 38062 ssh2] 
May 18 14::42:35 localhost sshd[18579]: Received disconnect from 222.186.21.244: 11:  [preauth] 
May 18 14::42:35 localhost sshd[18579]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.244  user=root 
May 18 14::42:39 localhost sshd[18585]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.244  user=root 
May 18 14::42:41 localhost sshd[18585]: Failed password for root from 222.186.21.244 port 50864 ssh2 
May 18 14::42:47 localhost sshd[18585] 


某种意义上来讲这是好事,因为这说明对方并还没有来得及安置后门程序,只能采取暴力破解的方式。那么接下来我要做的事情就是把对方IP加入到 "hosts.deny" 

引用

$ sudo vi /etc/hosts.deny 

ALL:110.164.67.47 
ALL:222.89.166.12 
ALL:221.229.166.30 
ALL:58.218.205.69    
ALL:58.218.204.239    
ALL:58.218.211.155    
ALL:222.186.21.236    
ALL:58.218.204.225    
ALL:58.218.204.241    
....... 


由于暴力破解骇客首先会尝试root 用户,所以还要禁止root ssh登录,修改sshd_conf文件。 

引用

$ sudo vi /etc/ssh/sshd_config 
#把PermitRootLogin 属性 yes 改为 no 
PermitRootLogin no 


到此,我能想到的检测及阻止对方的手段已经差不多了,是时候对一个最起码的安全意识做个总结了。 

  • 设置用户名密码一定要大小写字母数字及一些特殊符号的组合,增加暴力破解的难度,有可能的话可以定期更换密码。
  • 禁止ssh root 登录
  • 定期维护hosts.deny文件,可以选择安装一些第三方的工具自动根据一些规则维护hosts.deny 比如 "DenyHosts"
  • 为了避免骇客扫描已知服务器程序端口漏洞,修改服务程序的默认端口好,比如ssh服务不使用22端口
  • 设置 iptables 开启一些通用的防火墙规则,ubuntu系统可以使用 ufw


以下为一些网友建议及补充: 

  • 止密码登陆,同样修改 sshd_config 设置属性“PasswordAuthentication no” ,然后公钥和私钥的方式进行登陆。
  • 使用fail2ban ,fail2ban可以监视你的系统日志,然后匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作(一般情况下是调用防火墙屏蔽),如:当有人在试探你的SSH、SMTP、FTP密码,只要达到你预设的次数,fail2ban就会调用防火墙屏蔽这个IP,而且可以发送e-mail通知系统管理员,是一款很实用、很强大的软件!


还好这次事件也没有给我造成太大的影响和损失,反而让我加强了一些安全意识,对于菜鸟级的骇客还是能够抵挡一阵子的。欢迎跟帖讨论,你了解的一些入侵监测手段和防范方法,谢谢。 

分享到:
评论

相关推荐

    课工场新闻管理系统.rar

    新闻管理系统 ,是课工厂 学习JavaWeb 课程,,动态网页贯穿整个课程所用到的一个项目,这是一个运行在服务器端的项目,可以操作数据库实现增删改查,上传图片等操作,用户登录需要填写账号密码才可以实现功能。

    服务器visio图标

    "服务器Visio图标"是专为这一目的而设计的工具,主要用于创建清晰、专业的服务器机架图。Visio,由微软开发,是一款强大的绘图软件,广泛应用于流程图、组织结构图以及网络拓扑图等的绘制。在描述中提到,这些图标...

    RTSP流媒体服务器的搭建与测试

    RTSP(Real Time Streaming Protocol,实时流媒体协议)是一种网络控制协议,用于在IP网络上控制流媒体服务器。它是由RealNetworks、Netscape和Apple共同提出的,旨在控制音频和视频流的传送。RTSP通常用于流媒体...

    服务器配置性能计算公式

    #### 一、服务器配置性能计算公式 在IT行业中,评估服务器性能是一项非常重要的任务。为了确保服务器能够高效稳定地运行,需要通过一系列计算公式来评估其配置性能。这些计算公式可以帮助我们更好地理解服务器的...

    服务器验收单

    综上所述,服务器验收单不仅是一份简单的文档,更是确保服务器顺利安装、运行和维护的关键环节。通过详细的检查和确认,可以有效避免因硬件问题导致的工作延误,同时也有利于维护采购方的权益。

    简易Android新闻客户端(服务器、客户端源码、数据库)

    服务器使用Myeclipse开发,应用服务器Tomcat 客户端安卓4.1.2 数据库MySql 5.1.73 一款简单从网络获取新闻、保存至服务器上,由客户端访问的简易新闻客户端。 详细请阅读资源内README文档

    HP系列服务器VISIO图标

    Visio是一款由Microsoft开发的流程图和矢量图形软件,它在IT领域被广泛用于绘制网络拓扑图、服务器布局图以及各种流程图。 此压缩包包含了以下文件: 1. readme.txt:这是一个常见的文本文件,通常包含有关压缩包...

    搭建OTA下载服务器.doc

    搭建OTA服务器是比较简单的,但是做一个完整的OTA服务器却非常复杂,因为这要设计到软件的管理、下载的计费、安全认证等多个问题。 OTA下载的主要原理 OTA下载的主要原理是通过无线网络下载和安装J2ME应用程序。...

    PPPOE服务器测试软件

    描述中提到的“windows下的pppoe服务器软件”表明这是一款运行在Windows操作系统上的软件,适用于配置和调试PPPOE服务器。通常,这类软件会提供图形化界面,使得非技术用户也能相对容易地设置和管理PPPOE服务。它...

    stm32搭建web服务器

    在本文中,我们将探讨如何利用STM32F407微控制器和LWIP(Lightweight IP)库来搭建一个简单的Web服务器,并通过LAN9303以太网控制器连接网络。 首先,LWIP是一个开源、轻量级的TCP/IP协议栈,适用于资源有限的...

    获取淘宝服务器时间

    1. **服务器时间**:服务器时间是指网络服务器上设置的时间,它是网络服务中一个基本参考点,用于记录和验证各种操作的时间戳。由于服务器通常配置为与国际原子时保持同步,因此服务器时间被认为是可靠的。 2. **...

    android 获取服务器上资源(图片,文本)

    在Android开发中,获取服务器上的资源,如图片和文本,是一项常见的任务。HttpURLConnection是Java提供的一个基础网络连接类,可以用于实现与HTTP服务器的通信。在这个过程中,我们需要理解网络请求的基本原理,以及...

    linux下最小RTSP服务器实现

    在Linux环境下,构建一个最小的RTSP(Real Time Streaming Protocol)服务器是一项有趣且实用的实践,对于想要深入了解网络流媒体协议以及系统编程的初学者来说尤其有价值。RTSP是一种应用层协议,主要用于控制实时...

    搭建手机视频服务器,使用手机看自己的电脑上的视频

    搭建手机视频服务器是一项技术性较强的任务,涉及到网络通信、服务器配置和流媒体技术等多个领域。以下将详细讲解如何实现这个目标,以及与之相关的知识点。 首先,我们需要理解视频服务器的基本概念。视频服务器是...

    delphi xe7下Datasnap实现手机对服务器上数据库的操作

    在Delphi XE7环境下,使用Datasnap技术实现手机应用程序对服务器端数据库的操作是一项涉及到服务器端与客户端协同工作的技术实现。下面将详细解释如何使用Datasnap技术,以SQLite数据库为例,实现手机应用程序对...

    EXCEL服务器9.2.335 旗舰版(无限用户) ,附教程

    1 下载附件上的MSDE2SP4和勤哲Excel服务器2010 旗舰版ExcelServer2010UE SC335; 2 建议选择windows server2003 win xp (windows server 2008 店主没有测试过); 3 安装IIS Internet信息服务管理器 ; 4 ...

    C# Socket_服务端向指定的客户端发送消息(包含服务器)

    在本文中,我们将深入探讨如何使用C#的Socket编程来实现一个简单的聊天应用程序,其中包含服务器和客户端的交互。Socket编程是网络通信的基础,它允许应用程序通过网络进行数据传输。在C#中,System.Net命名空间下的...

    delphi做的文件上传下载服务器端

    标题 "delphi做的文件上传下载服务器端" 描述了一个使用Delphi编程语言开发的服务器程序,该程序专门设计用于处理文件的上传和下载功能。在IT领域,这样的系统通常涉及网络编程、多线程和并发处理,以确保能有效地...

    C#各种类型TCP&UDP服务器代码

    在IT行业中,网络编程是构建分布式系统和网络应用的基础,而C#作为一种强大的面向对象的编程语言,提供了丰富的API来支持TCP和UDP协议的服务器开发。本资源包含使用Socket类库以及TcpListener和UdpClient类实现的...

    stm32下的ftp服务器

    总的来说,STM32红龙103开发板上的FTP服务器实现是一个结合了硬件、网络协议栈和应用层编程的综合性任务。通过这个过程,开发者不仅可以掌握LWIP协议栈的使用,还能对网络通信和嵌入式服务器有更深入的理解。

Global site tag (gtag.js) - Google Analytics