幽灵漏洞(GHOST)检测方法及修复建议

0x01 前言

昨日,【CVE 2015-0235: GNU glibc gethostbyname 缓冲区溢出漏洞 】全面爆发,该漏洞的产生是Qualys公司在进行内部代码审核时,发现了一个在GNU C库(glibc)中存在的__nss_hostname_digits_dots函数导致的缓冲区溢出漏洞。这个bug可以通过gethostbyname *()函数来触发,本地和远程均可行。该漏洞(幽灵漏洞)造成了远程代码执行,攻击者可以利用此漏洞远程获取系统进程当前的权限。

wKiom1TJlrPAbzdCAAIZ4s2czoE085

鉴于网上诸多glibc的原理普及,本文章就不多啰嗦了,直接实践如何检测服务器是否存在该漏洞,以及修复漏洞的方法。

0x02 检测是否存在幽灵漏洞(GHOST)

检测方法1【RedHat官方检测方法】:

wKioL1TJlgnwIFeiAADfTNlJxwQ785

ghost_check.sh源码:

  1. #!/bin/bash
  2. vercomp () {
  3. if [[ $1 == $2 ]]
  4. then
  5. return 0
  6. fi
  7. local IFS=.
  8. local i ver1=($1) ver2=($2)
  9.     # fill empty fields in ver1 with zeros
  10.     for ((i=${#ver1[@]}; i<${#ver2[@]}; i++))
  11. do
  12. ver1[i]=0
  13. done
  14.     for ((i=0; i<${#ver1[@]}; i++))
  15. do
  16. if [[ -z ${ver2[i]} ]]
  17. then
  18.             # fill empty fields in ver2 with zeros
  19. ver2[i]=0
  20. fi
  21.         if ((10#${ver1[i]} > 10#${ver2[i]}))
  22. then
  23. return 1
  24. fi
  25.         if ((10#${ver1[i]} < 10#${ver2[i]}))
  26. then
  27. return 2
  28. fi
  29. done
  30. return 0
  31. }
  32. glibc_vulnerable_version=2.17
  33. glibc_vulnerable_revision=54
  34. glibc_vulnerable_version2=2.5
  35. glibc_vulnerable_revision2=122
  36. glibc_vulnerable_version3=2.12
  37. glibc_vulnerable_revision3=148
  38. echo “Vulnerable glibc version <=” $glibc_vulnerable_version”-“$glibc_vulnerable_revision
  39. echo “Vulnerable glibc version <=” $glibc_vulnerable_version2″-“$glibc_vulnerable_revision2
  40. echo “Vulnerable glibc version <=” $glibc_vulnerable_version3″-1.”$glibc_vulnerable_revision3
  41. glibc_version=$(rpm -q glibc | awk -F”[-.]” ‘{print $2″.”$3}’ | sort -u)
  42. if [[ $glibc_version == $glibc_vulnerable_version3 ]]
  43. then
  44. glibc_revision=$(rpm -q glibc | awk -F”[-.]” ‘{print $5}’ | sort -u)
  45. else
  46. glibc_revision=$(rpm -q glibc | awk -F”[-.]” ‘{print $4}’ | sort -u)
  47. fi
  48. echo “Detected glibc version” $glibc_version” revision “$glibc_revision
  49. vulnerable_text=$”This system is vulnerable to CVE-2015-0235. <https://access.redhat.com/security/cve/CVE-2015-0235>
  50. Update the glibc and ncsd packages on your system using the packages released with the following:
  51. yum install glibc”
  52. if [[ $glibc_version == $glibc_vulnerable_version ]]
  53. then
  54. vercomp $glibc_vulnerable_revision $glibc_revision
  55. elif [[ $glibc_version == $glibc_vulnerable_version2 ]]
  56. then
  57. vercomp $glibc_vulnerable_revision2 $glibc_revision
  58. elif [[ $glibc_version == $glibc_vulnerable_version3 ]]
  59. then
  60. vercomp $glibc_vulnerable_revision3 $glibc_revision
  61. else
  62. vercomp $glibc_vulnerable_version $glibc_version
  63. fi
  64. case $? in
  65.     0) echo “$vulnerable_text”;;
  66.     1) echo “$vulnerable_text”;;
  67.     2) echo “Not Vulnerable.”;;
  68. esac

检测方法2【简单的检测方法】:

wKiom1TJlT_DkByhAABfv_N6A48957

检测方法2源码:

  1. /usr/sbin/clockdiff `python -c “print ‘0’ * $((0x10000-16*1-2*4-1-4))”`

检测方法3【二进制检测方法】:

wKiom1TJlVaSh3dhAABQKHIDbfc910

ghost.c源码:

  1. #include <netdb.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <errno.h>
  6. #define CANARY “in_the_coal_mine”
  7. struct {
  8. char buffer[1024];
  9. char canary[sizeof(CANARY)];
  10. temp = { “buffer”, CANARY };
  11. int main(void) {
  12. struct hostent resbuf;
  13. struct hostent *result;
  14. int herrno;
  15. int retval;
  16.   /*** strlen (name) = size_needed – sizeof (*host_addr) – sizeof (*h_addr_ptrs) – 1; ***/
  17. size_t len = sizeof(temp.buffer) – 16*sizeof(unsigned char) – 2*sizeof(char *) – 1;
  18. char name[sizeof(temp.buffer)];
  19. memset(name, ‘0’, len);
  20. name[len] = ‘\0’;
  21. retval = gethostbyname_r(name, &resbuf, temp.buffer, sizeof(temp.buffer), &result, &herrno);
  22. if (strcmp(temp.canary, CANARY) != 0) {
  23.     puts(“vulnerable”);
  24. exit(EXIT_SUCCESS);
  25. }
  26. if (retval == ERANGE) {
  27.     puts(“not vulnerable”);
  28. exit(EXIT_SUCCESS);
  29. }
  30.   puts(“should not happen”);
  31. exit(EXIT_FAILURE);
  32. }

0x03 在线修复方案

CentOS, Red Hat, Fedora等系列衍生版本(RHN建议):

  1. yum update glibc

Debian, Ubuntu等系列衍生版本:

  1. apt-get clean && apt-get update && apt-get upgrade

0x04 离线修复方案

Centos6.5离线补丁

先检查本地glibc包安装了哪些相关包

  1. rpm -qa|grep glibc

 

wKioL1TJlkrBCW05AAAOnefHrVg121

然后,到阿里源下载对应版本

  1. cat > update.txt << EOF
  2. http://mirrors.aliyun.com/centos/6.6/updates/x86_64/Packages/glibc-2.12-1.149.el6_6.5.i686.rpm
  3. http://mirrors.aliyun.com/centos/6.6/updates/x86_64/Packages/glibc-2.12-1.149.el6_6.5.x86_64.rpm
  4. http://mirrors.aliyun.com/centos/6.6/updates/x86_64/Packages/glibc-common-2.12-1.149.el6_6.5.x86_64.rpm
  5. http://mirrors.aliyun.com/centos/6.6/updates/x86_64/Packages/glibc-devel-2.12-1.149.el6_6.5.x86_64.rpm
  6. http://mirrors.aliyun.com/centos/6.6/updates/x86_64/Packages/glibc-headers-2.12-1.149.el6_6.5.x86_64.rpm
  7. EOF

进行后台断点下载补丁包

  1. wget -b -i update.txt -c

使用yum本地安装

  1. yum localinstall glibc-*

或是rpm安装

  1. rpm -ivUh glibc-*

wKiom1TJlX2CsELNAAAQ9Ff8JmA246

Red Had系列衍生版本

使用方法参考上文【Centos6.5离线补丁】的修补方法

http://mirrors.aliyun.com/centos/7/updates/x86_64/Packages/glibc-2.17-55.el7_0.5.i686.rpm

http://mirrors.aliyun.com/centos/7/updates/x86_64/Packages/glibc-2.17-55.el7_0.5.x86_64.rpm

0x05 修复完成检测

ghost_check.sh脚本检测

wKiom1TJlZazur-5AAB2YZ_jGg8432

ghost.c脚本检测

wKiom1TJlaez78jxAABLpTENXdA610

 

 

幽灵漏洞(GHOST)检测方法及修复建议:等您发表观点!

发表评论


快捷键:Ctrl+Enter