Linux操作系统root账号密码获取防范技术研究

Linux操作系统由于其开源性、低成本等特点,在商业上运用越来越多,很多公司都采用LAMP(Linux+Apache+Mysql+PHP)典型架构]。相对于Windows操作系统的密码获取技术而言,Linux密码获取比较困难。在Windows中,不论设置多么复杂的密码,都可以通过彩虹表、键盘记录、mimikatz_trunk域名注入获取密码等技术获取包括Windows 2008 Server在内的所有操作系统密码。但在Linux操作系统中,如果设置一个非常复杂的密码,破解成功的几率相对较低。在获得网站Webshell权限的前提下,通过提权等方法可以获得系统权限,通过查看“/etc/shadow”文件内容可以获取Linux操作系统的用户名和加密密码,但要获取最高权限root用户的密码就比较困难。直接添加帐号容易被发现,所以如何获取Root帐号的密码非常必要。本文主要研究内容包括:使用普通用户权限记录Root密码,使用ssh后门方法记录root密码,安装rootkit后门程序记录root帐号密码,通过john工具破解shadow密码,专用sulog后门记录su密码。

1.Linux密码原理

1.1Linux密码构成

    在Linux系统中涉及系统登录密码的有两个重要文件/etc/passwd和etc/shadow,第一个文件记录用户信息,第二个是真正保存用户密码信息的【3】。在/etc/passwd 中,每一行都表示的是一个用户的信息;一行有7个段位;每个段位用冒号分割。比如下面是一个Linux系统中的/etc/passwd 的两行,其格式为username:x:UID:GID:username full:username home:shell type。

第一字段:用户名(也被称为登录名);

第二字段:口令,显示为x表示其实密码已被映射到/etc/shadow 文件中;

第三字段:UID ;

第四字段:GID;

第五字段:用户名全称,这是可选的,可以不设置。

第六字段:用户的家目录所在位置;

第七字段:用户所用SHELL的类型,常见为/bin/bash;

/etc/shadow文件是/etc/passwd 的影子文件,这个文件并不由/etc/passwd产生的,这两个文件应该是对应互补的;shadow内容包括用户名及被加密的密码以及其它/etc/passwd 不能包括的信息,比如用户的有效期限等;这个文件只有root权限可以读取和操作。

/etc/shadow 文件的内容包括9个段位,每个段位之间用冒号分割。通过研究发现即使两个帐号的密码相同,其密码加密值也不一样。其各个字段的含义如下:

第一字段:用户名(也被称为登录名),/etc/shadow中的用户名和/etc/passwd中的用户名 是相同的,这样就把passwd 和shadow中用的用户记录联系在一起,这个字段是非空的;

第二字段:密码(已被加密),如果有些用户在这段是x,表示这个用户不能登录到系统;这个字段是非空的;

第三字段:上次修改口令的时间。这个时间是从1970年01月01日算起到最近一次修改口令的时间间隔(天数),您可以通过passwd 来修改用户的密码,然后查看/etc/shadow中此字段的变化;

第四字段:两次修改口令间隔最少的天数,也就是说用户必须经过多少天才能修改其口令。如果设置为0,则禁用此功能。此项功能用处不是太大,默认值是从/etc/login.defs文件定义中获取,PASS_MIN_DAYS 中有定义;

第五字段:两次修改口令间隔最多的天数。这个能增强管理员管理用户口令的时效性,应该说增强了系统的安全性;系统默认值是在添加用户时由/etc/login.defs文件定义中获取,在PASS_MAX_DAYS 中定义;

第六字段:提前多少天警告用户口令将过期。当用户登录系统后,系统登录程序提醒用户口令将要作废。系统默认值是在添加用户时由/etc/login.defs文件定义中获取,在PASS_WARN_AGE 中定义;

第七字段:在口令过期之后多少天禁用此用户。此字段表示用户口令作废多少天后,系统会禁用此用户,也就是说系统会不能再让此用户登录,也不会提示用户过期,完全禁用;

第八字段:用户过期日期;此字段指定了用户作废的天数(从1970年的1月1日开始的天数),如果这个字段的值为空,帐号永久可用;

第九字段:保留字段,目前为空,以备将来Linux发展之用;

  例如某系统root帐号在etc/shadow文件中的表现方式为:root:$1$kbIAhX/R$PiLL1U.n6bivtIr4oTi2y0:15377:0:99999:7::: 。  

1.2 Linux密码文件位置

    绝大部分Linux操作系统的密码文件名称为shadow,但也有一些特殊的Linux/Unix操作系统的密码文件名称为passwd,而且密码文件所在位置也不一样。下面是一些Linux常见系统的密码文件位置:

Linux  /etc/shadow  

SystemV Release 4.2 /etc/security

SystemV Release 4.0 /etc/shadow

SunOS 5.0 /etc/shadow  

SCOUnix / tcb /auth/files/  

OSF/1 /etc/passwd  

HP-UX /.secure/etc/ passwd  

BSD4.x /etc/master.passwd  

AIX3 /etc/security/passwd  

IRIX5 /etc/shadow

1.3 Linux系统采用的加密算法

1.3.1查看密码的加密算法

Linux帐户的密码加密后存放于/etc/shadow文件中。对于Linux操作系统的密码采用哪种加密方式,取决于/etc/pam.d/system-auth或者/etc/pam.d/passwd文件定义,通过more /etc/pam.d/system-auth或者authconfig --test | grep hashing命令可以获取操作系统使用哪种加密算法,目前有sha256、sha512和md5加密算法【4】

 在Red Hat Enterprise Linux Server中,可以通过authconfig --test | grep hashing命令来获取当前系统帐号的密码加密算法,如图1所示。

 

图1 获取Red Hat Enterprise Linux Server系统帐号加密算法

1.3.2 Linux/UNIX采用5种加密算法

   Linux/UNIX操作系统目前采用5种加密算法,可以通过加密后的密码值来识别,主要是通过帐号后面的$X来判断。头两字节为$1表示MD5加密算法,$2表示使用Blowfish加密算法,$5表示使用SHA-256加密算法,$6表示使用SHA-512加密算法,其余为标准的DES。例如“root:$1$kbIAhX/R$PiLL1U.n6bivtIr4oTi2y0:15377:0:99999:7:::”其加密算法为md5。

1.4  Linux密码操作

   对于Linux密码操作主要有增加、删除和修改,第一次添加用户时需要设定一个密码,修改密码使用“passwd”,删除密码在删除用户时系统自动删除设置的密码。读取密码加密文件必须具备Root权限,通过“cat /etc/shadow”命令来读取shadow文件的内容。

2.获取Linux Root密码方法研究

   Linux Root帐号密码获取主要有四种:键盘记录、嗅探,替换关键程序以及暴力破解。目前并没有非常完美的密码获取方法。

2.1键盘记录获取法

   根据操作系统内核版本,编译一个修改过的SSH或者内核键盘记录软件,早期的键盘记录软件有keylogger、keylog等。在Root帐号下通过编译键盘记录程序或者执行编译好的键盘记录程序,当Root用户登录时,程序自动捕获Root帐号输入的密码。此方法需要有root权限,但可以做到极为隐秘。如使用内核键盘记录功能,可以增加一些模块隐藏、文件隐藏、链接隐藏等功能以增加程序隐秘性。

2.2嗅探

    在Windows操作系统中可以通过Cain工具嗅探FTP、POP3、SSH等应用程序登录的口令,在Linux中可以使用dsniff嗅探Root帐号的登录口令。通过在相同网段中的被控机器上发送arp欺骗数据包,将目标机器的流量导到被控主机上,并分析出其中的密码(如ftp, ssh), 如果被控服务器也是linux的,目前通过开源的软件比较难抓取ssh的密码(需要进行中间人攻击, dsniff不具备中间攻击的能力,而windows下的Cain已实现伪造证书进行中间人攻击),所以可以变通的通过抓取其他服务的密码获取root密码,如ftp、smb, linux中ftp通常使用操作系统认证,抓取ftp密码就等于抓取了系统的密码。

2.3替换关键程序法

   目前有两种方法,一种是网上使用的fakesu.c程序,另外一种是获取root权限后,替换su程序。

2.3.1fakesu.c程序法

     网上使用的kpr-fakesu.c(简称fakesu.c)程序【5】,由koper(koper@linuxmail.org)开发, 程序最新版本为 V0.9beta167。该程序是在Webshell权限或者拥有普通帐号的权限下,通过修改该程序中的配置文件,当当前用户使用su命令时,捕获具有root帐号权限的密码,如图2所示。该程序可以将密码发送到指定邮箱,也可以在本地生成文件,但这个方法所有内容都是伪造的,所以有明显的缺点:

1)密码提示和鉴权结果与实际系统的不一致,容易被发现;

2)由于程序鉴权过程是伪造的,无论输入密码是否正确都会发送结果到邮箱。

3)成功记录密码后会删除.bash_profile,该文件被删除后会出现一些异常。

通过研究该程序,笔者进行了一些优化:

   1)根据语义环境定义密码提示信息,通过测试实际环境来获取其“真实”的su密码输入错误的提示信息;

   2)修改程序中存在的缺陷,在获取密码后还原最初的环境。

 

图2通过fakesu.c程序获取root帐号密码

2.3.2替换su程序法

  在获取Root权限后,通过替换su程序来获得Root密码,该方法通过提取su的源程序,重新编译su,效果较好,且不容易被发现,该方法的前提是必须获取Root权限。

2.4暴力破解法

2.4.1在线网站破解法

   通过提权或者其他方法获取root权限后,通过查看“/etc/shadow”文件的内容,将加密的密文提取出来,可以通过cmd5.com进行破解。需要注意的是提取的密文为第二字段,例如”root:$1$kbIAhX/R$PiLL1U.n6bivtIr4oTi2y0:15377:0:99999:7:::”中的密文为“$1$kbIAhX/R$PiLL1U.n6bivtIr4oTi2y0”,将其放入www.cmd5.com网站进行破解即可,如图3所示。使用该方法可以破解简单的密码,对于设置高强度的密码,该网站基本无能为力。

 

图3通过cmd5.com在线破解linux密码

2.4.2  John软件破解法

  “John the Ripper password cracker(简称John)”是一款Linux专用密码破解工具,网站地址http://www.openwall.com/john/,目前该软件的最新版本为1.9.7,可以通过John暴力密码破解工具进行密码破解【6】。使用方法和步骤如下:

1)tar zxvf john-1.7.9.tar.gz

2)cd  src

3)make

4)make clean generic 或者 make clean SYSTEM

5)cd  run

6)./unshadow /etc/passwd /etc/shadow >passwd.txt

7)chmod 600 passwd.txt

8)./john passwd.txt

9)./john -show passwd.txt

2.4.3SSH暴力破解

   Secure Shell(缩写为SSH)[7],由IETF的网络工作小组(Network Working Group)所制定;SSH为一项创建在应用层和传输层基础上的安全协议,为计算机上的Shell(壳层)提供安全的传输和使用环境。SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。通过SSH可以对所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。SSH是Linux下最常见的一个服务,绝大多数操作系统安装后都会配置该服务。通过连接SSH服务来远程管理计算机,其默认端口为“22”。根据Freebuf网投稿者“H3lvin” [8]的研究表明,与往年不同,在十年前,一台服务器放在网络上,大概数周的时间才会被黑客光顾,现在一台服务器在网络中,在几个小时之内,就会有黑客开始进行攻击尝试了,而SSH暴力破解攻击经久不衰!

   目前SSH暴力破解主要有两种方式,一种是专业暴力破解软件,另外一种是通过python等语言编写的脚本暴力破解程序。专业暴力破解软件常见的有thc-hydra和relaxscan。

thc-hydra最先版本为7.6(下载地址https://www.thc.org/thc-hydra/),关于hydra是一款着名的暴力破解工具 [9],其常见SSH暴力破解命令为“hydra -l root -P /home/Linux/passwd.dic -e ns -f -vV target_ip ssh2”。Relaxscan是专门针对SSH账号进行暴力的工具,linuxfly网提供了有关该程序的详细使用方法[10]

SSH帐号脚本暴力工具通过编程,模拟实际登录进行暴力破解,常见的有theRandy [11]撰写的SSH暴力破解程序,在Linux下通过执行“python sshCommand2.py -H 10.10.1.36 -u root -F dictionary.txt”命令,对IP地址为10.10.1.36的服务器的root账号进行密码暴力破解;Google支持多协议破解工具脚本项目“patator”[12],该脚本程序也支持ssh帐号暴力破解。

3.Linux Root账号密码防范技术

针对可能出现获取Linux Root账号的技术,可以通过安全防范技术和安全规范等方法来进行防范,本文给出一些可供参考的方法和策略。

3.1安全技术防范

3.1.1设置强健的账号密码安全策略

针对获取Shadow值后进行密码破解,可以采取对系统普通账号和Root账号设置强健的密码安全策略,定期执行安全检测和维护来防范。密码位数至少10位以上,设置密码包含字母大小写、数字和特殊字符。对服务器文件读写进行监控,日志文件异地安全保存。

3.1.2定期升级系统补丁和应用程序补丁

对高风险业务程序做降权处理,尽量以低权限运行,例如Jboss和Structs等,确保即使出现高危漏洞,也不会危及Root权限。及时更新系统补丁和应用程序补丁,关注安全业界高危漏洞,防范通过Web应用程序漏洞直接获取Root权限。

3.1.3定期对系统进行Rootkit专用检测

针对Rootkit程序可以通过Rootkit检测程序来防范,互联网上有Rootkit Hunter和Chkrootkit两款开源软件,可以检测绝大部分已知的Rootkits、嗅探和后门程序。

3.1.4 SSH账号防暴力破解

   有关防范SSH帐号被暴力破解【13】,网上已经有很多方法,例如修改SSH默认端口、采用 RSA公钥认证、使用iptables脚本、使用sshd日志过滤、使用tcp_wrappers过滤以及使用knockd等方法。

3.2建立完善的入侵应急响应制度

   重点系统和重要系统定期聘请专业安全公司进行系统风险评估和安全检测,发现系统存在的漏洞和弱点,针对这些弱点和漏洞进行改进;同时建立入侵应急响应制度,针对各种可能出现的入侵情况,建立相应的处理措施。

4结束语

   本文介绍了Linux密码的基本原理,介绍了常见的Linux root密码获取的四种方法,最后针对这些可能获取Linux root帐号的方法给出了安全防范技术和防范策略。通过这些安全技术和策略,可以大大降低系统被攻击后获取最高Root帐号权限的风险,针对Linux操作系统的安全维护和检测具有一定的参看价值。

 

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。

http://image95.pinlue.com/image/173.jpg
分享
评论
首页