Linux加密、安全版块、root密码破解

当一个入侵者进入了你的系统并且种植了木马,通常会想办法来隐蔽这个木马(除了木马自身的一些隐蔽特性外,他会尽量给你检查系统的过程设置障碍),通常入侵者会修改一些文件,比如管理员通常用ps -aux来查看系统进程,那么入侵者很可能用自己经过修改的ps程序来替换掉你系统上的ps程序,以使用ps命令查不到正在运行的木马程序。如果入侵者发现管理员正在运行crontab作业,也有可能替换掉crontab程序等等。所以由此可以看出对于系统文件或是关键文件的检查是很必要的。目前就系统完整性检查的工具用的比较多的有两款: Tripwire和AIDE,前者是一款商业软件,后者是一款免费的但功能也很强大的工具。

AIDE(Advanced Intrusion Detection Environment)

高级入侵检测环境)是一个入侵检测工具,主要用途是检查文件的完整性,审计计算机上的那些文件被更改过了。

AIDE能够构造一个指定文件的数据库,它使用aide.conf作为其配置文件。 AIDE数据库能够保存文件的各种属性,包括:权限(permission)、索引节点序号(inode number)、所属用户(user)、所属用户组(group)、文件大小、最后修改时间(mtime)、创建时间(ctime)、最后访问时间(atime)、增加的大小以及连接数。 AIDE还能够使用下列算法:sha1、 md5、 rmd160、 tiger,以密文形式建立每个文件的校验码或散列号。

这个数据库不应该保存那些经常变动的文件信息,例如:日志文件、邮件、 /proc文件系统、用户起始目录以及临时目录

安装AIDE工具

yum -y install aide

    

    

    

修改配置文件:

vim  /etc/aide.conf

    

    

          

    

     

注1:!/usr/src/    表示忽略这个文件的检查

注2:往下还有很多,这里不做一一赘述

初始化默认的AIDE的库

 首先,您必须创建一个数据库,以便执行将来的检查。在机器插入网络之前,应在安装操作系统和应用程序后立即执行此操作。您可以通过发出命令来完成此操作 aide --init这将创建一个数据库,其中包含您在配置文件中选择的所有文件。现在应将新创建的数据库移动到安全位置,例如只读介质。您还应该将配置文件和AIDE二进制文件,最好是手册页和本手册放在该介质上。请记住编辑配置文件,以便从该只读介质中读取输入数据库。配置文件不应保留在目标计算机上。攻击者可以读取配置文件并对其进行更改,如果他确实改变了配置文件,他可以将他的rootkit放在AIDE不检查的地方。因此,只有在检查期间才能访问只读媒体。

现在你已经准备好了。您现在可以检查文件的完整性。这可以通过给出命令来完成 aide --checkAIDE现在读取数据库并将其与磁盘上找到的文件进行比较。AIDE可能会发现您可能不期望的地方发生变化。例如,tty设备通常会更改所有者和权限。您可能希望阅读长报告,由您决定。但是我们大多数人没有时间或倾向于每天读取大量垃圾,因此您应该修改配置文件以仅包含不应更改的某些文件的文件和属性。但请记住,你不应该忽视太多,因为这会让你受到攻击。入侵者可能会将他/她/它/他们的根工具包放在您完全忽略的目录中。一个很好的例子是/ var / spool / lp或类似的东西。这是lp守护程序存储其临时文件的位置。但是你不应该完全忽略它。您应该只忽略lp守护程序不断创建的文件格式。并记住在regexp结束时使用$ -sign。这会阻止某人创建一个被忽略的目录及其内容。

现在您已经修剪了配置文件,您应该更新数据库。这可以通过以下方式完成: aide --update update命令也与check相同,但它会创建一个新数据库。现在,此数据库应与新配置文件一起放在该只读介质上。只要有必要,应重复检查,修剪,更新周期。我建议偶尔检查一下配置文件。“一会儿”的定义取决于你的偏执狂。有些人可能希望每次检查后每天都这样做。有些人可能想每周做一次。

数据库中通常存在一些偏差。我的意思是漂移是创建新文件,编辑应用程序的配置文件,大量的小变化堆积,直到报告变得不可读。这可以通过偶尔更新数据库来避免。我自己每天都在运行更新。但是,我几乎不经常更换输入数据库。替换输入数据库应始终是手动操作。这不应该是自动化的。

还有另一种方法可以做到这一点。这种方法可能适用于拥有大量机器助手的人。您可以aide --init 在所有主机上运行 ,并将生成的数据库移动到中央主机,您可以在其中比较不同版本的数据库。 aide --compare 这样可以释放受监视计算机上的资源。

    

报错:因为没有aide.db.gz文件,此时还不能对文件进行监控

    

解决:

    

实战1

 vim /etc/aide.conf

例子:TEST=p+u+g+s+md5     #定义监控规则

    

监控data下的file1 file2 file3

/data/ TEST

!/data/ file3     #不监控data下的fie3文件

    

aide --init 保存新定义的监控规则到aide的数据库中(/var/lib/adie)

或者aide --update

未创建data目录时及下面的文件时:

   

创建完data目录时及下面的文件时: 

  

 加入到定时任务中,每天凌晨4点半执行一次

echo "30 4 * * * root /usr/sbin/aide --check" >> /etc/crontab

启用安全(高质量)密码策略

以下命令将启用SHA512而不是使用MD5

authconfig --passalgo=sha512 —update

/etc/security/pwquality.conf

pwquality.conf 提供了一种配置默认密码质量要求的方法系统密码。此文件由libpwquality库和使用的实用程序读取
这个库用于检查和生成密码。
该文件具有非常简单的name = value格式,可能以#字符开头的注释。行的开头,行的末尾和=符号周围的空格是忽略。

sed -i 's/# difok/difok/' /etc/security/pwquality.conf

sed -i 's/# minlen = 9/minlen = 14/' /etc/security/pwquality.conf

sed -i 's/# dcredit/dcredit/' /etc/security/pwquality.conf

sed -i 's/# ucredit/ucredit/' /etc/security/pwquality.conf

sed -i 's/# lcredit/lcredit/' /etc/security/pwquality.conf

sed -i 's/# ocredit/ocredit/' /etc/security/pwquality.conf

sed -i 's/# minclass = 0/minclass = 4/' /etc/security/pwquality.conf

sed -i 's/# maxrepeat = 0/maxrepeat = 3/' /etc/security/pwquality.conf

sed -i 's/# maxclassrepeat = 0/maxclassrepeat = 3/' /etc/security/pwquality.conf

sed -i 's/# gecoscheck = 0/gecoscheck = 1/' /etc/security/pwquality.conf

    

各参数解释:

difok
新密码中不得出现的字符数
密码。(默认5)

minlen
新密码的最小可接受大小(如果未禁用信用,则加一这是默认值)。(参见pam_pwquality(8)。)
不能设置为低于的值6.(默认9)

dcredit
新密码中包含数字的最大功劳。如果小于0就是
新密码中的最小位数。(默认1)

ucredit
新密码中包含大写字符的最大功劳。如果少
它是0,它是新密码中最小的大写字符数。
(默认1)

lcredit
在新密码中使用小写字符的最大功劳。如果少
小于0是新密码中的最小小写字符数。
默认1)

ocredit
在新密码中包含其他字符的最大功劳。如果不到0它是新密码中其他字符的最小数量。(默认1)

minclass
新密码所需的最小字符数(数字,大写,小写,其他)。(默认为0)

maxrepeat
新密码中允许的最大相同连续字符数。如果值为0,则禁用检查。(默认为0)

maxsequence
新密码中单调字符序列的最大长度。
例子
这种序列的'12345'或'fedcb'。请注意,大多数此类密码不会通过简单检查,除非序列只是一小部分密码。如果值为0则禁用检查。(默认为0)

maxclassrepeat
新的同一类中允许的最大连续字符数密码。如果值为0,则禁用检查。(默认为0)

gecoscheck
如果非零,请检查GECOS字段中是否包含长于3个字符的单词用户的passwd条目包含在新密码中。
检查是如果值为0,则禁用。(默认值为0)

badwords
空格分隔的单词列表,不得包含在密码中。
这些是cracklib字典检查的附加单词。
此设置也可以应用程序用来模拟gecos检查不是的用户帐户创造了。

DICTPATH
cracklib词典的路径。 默认是使用cracklib默认值。

查看密码的加密算法

Linux帐户的密码加密后存放于/etc/shadow文件中。对于Linux操作系统的密码采用哪种加密方式,取决于/etc/pam.d/system-auth或者/etc/pam.d/passwd文件定义

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

    

最后,所有用户都需要重新设置密码才能生效。可以使用 chage -d 0 userName 强制所有用户下次登录修改密码(如下)

 for i in `cat /etc/passwd|grep -v "nologin"|grep "bash"|awk -F ':' '{print $1}'`;do chage -d 0 $i;done

 我再以 lisi 用户登录时:

     

Linux/UNIX采用5种加密算法

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

Linux密码操作

在早期的Linux系统中,/etc/passwd文件含有系统每个用户的信息,当然,用户的口令经过一定的数字与逻辑算法后把一个运算结果(可见字符串)放到了passwd文件中,加密强度并不大。于是,早期黑客们只要拿到/etc/passwd这个文件,系统就已经攻入一半了。后来,随着安全级别的提高,出现了passwd文件中口令单独加密的情况,密码加密后的结果和其他一些辅助信息存到了shadow文件。至于采用何种保存形式和加密算法,可以用/usr/sbin/authconfig程序来设置。用户登录时输入的口令经计算后与/etc/passwd和/etc/shadow中的结果相比较,符合则允许登录,否则拒绝登录。

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

破解Linux密码

在进行如何安全设置Linux密码前,先看看如何破解Linux密码。Linux使用的是DES(加密函数式是Crypt)或MD5加密算法,由于计算量之大,它们几乎很难被逆向破解。

DES口令密文是有13个ASCII字符的字符串,而MD5口令密文的启始字符总是“$1$”

如何知道root用户的密码呢?入侵者打开了/etc/shadow文件

root的冒号后面就是加密后的密码。开始破解工作吧。

破解Linux口令的工具有很多,如oclhash、John the Ripper、Crack by Alex Muffett和Cracker Jack等等,其中John the Ripper的功能最为强大,速度也最快。将/etc/shadow下载到本地,先使用John the Ripper的简单模式试一下,但没有结果

注:该文档是以centos7.4.1708,内核:3.10.0-693.el7.x86_64
wget https://www.openwall.com/john/j/john-1.8.0.tar.gz
tar -zxvf john-1.8.0.tar.gz -C /usr/local/
cd /usr/local/john-1.8.0/src/
make
make clean SYSTEM      #其中SYSTEM是适当的制造目标。或者,如果未列出您的系统就使用下一条命令
make clean generic                
cd ../run/
./john --test
./john #查看john的可用参数
--single           “单一裂缝”模式
--wordlist=FILE        --stdin wordlist模式,从FILE或stdin读取单词
--rules            为wordlist模式启用字错误规则
--incremental[=MODE]     “增量”模式[使用部分模式]
--external=MODE       外部模式或字滤波器
--stdout[=LENGTH]      只输出候选密码[cut LENGTH]
--restore[=NAME]         恢复中断的会话[称为NAME]
--session=NAME         为NAME提供一个新会话
--status[=NAME]       会话的打印状态[称为NAME]
--make-charset=FILE             制作一个字符集,FILE将被覆盖
--show               显示破解的密码
--test[=TIME]                         运行每个TIME秒的测试和基准测试
--users=[-]LOGIN|UID[,..]      [不]仅加载此(这些)用户
--groups=[-]GID[,..]                仅加载此(这些)组的用户[not]
--shells=[-]SHELL[,..]             仅用[out]这个(这些)shell加载用户
--salts=[-]N                             只加载[out]至少N个密码的盐
--save-memory=LEVEL         启用内存保存,级别为1..3
--node=MIN[-MAX]/TOTAL    此节点的数字范围超出TOTAL计数
--fork=N                                 fork N进程
--format=NAME                     制哈希类型名称:descrypt /bsdicrypt/md5crypt/bcrypt/LM/AFS/tripcode/dummy

开始破解:

      

将passwd和shadow这2个文件合并,并指定默认的字典(如下图):  

    

解决:

    make linux-x86-64        #将上面编译时的make clean generic换成make linux-x86-64重新编译即可

破解:

     

 OK    成功破解~!~!~

这里是弱密码,如果是未知的密码就得看字典怎么样了,时间也会相对来说长一点  && 机器性能 && 心理学 等等....

我试着添加了个用户,并赋予新用户复杂一点的密码就卡这里了(如下图):

     

试着在password.lst中添加新用户的密码:

    

    

实用示例

 Linux密码破解主要基于两种一种是基于字典,将收集到的密码保存在dic文件中,因此破解成功取决于字典中的密码。

另外一个就是暴力破解,暴力破解取决于计算机的硬件运算能力和密码设置的长度和难易程度。

安全/etc/login.defs Pasword政策

 

每个会话的最大密码登录尝试次数:

 

Sysctl安全

/etc/sysctl.conf

net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.tcp_max_syn_backlog = 1280
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.tcp_timestamps = 0

拒绝所有TCP Wrappers
TCP包装器可以提供一种快速简便的方法来控制对链接到它们的应用程序的访问。TCP Wrapper感知应用程序的示例是sshd和portmap。

以下命令阻止除SSH之外的所有命

echo "ALL:ALL" >> /etc/hosts.deny
echo "sshd:ALL" >> /etc/hosts.allow

启用S​​SH警告横幅

 /etc/issue

1、服务器禁止PING

echo "echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all" >> /etc/rc.d/rc.local

2、防止IP欺骗

echo -e "order bind,hosts multi off nospoof on"> /etc/host.conf

防止非授权用户获得权限

#!/bin/bash
jia(){
chattr +i /etc/passwd
chattr +i /etc/shadow
chattr +i /etc/group
chattr +i /etc/gshadow
chattr +i /etc/services
}
jian(){
chattr -i /etc/passwd
chattr -i /etc/shadow
chattr -i /etc/group
chattr -i /etc/gshadow
chattr -i /etc/services
}
read -p "您想删除用户还是添加用户(1:添加,2:删除): " xz
if [ $xz == 1 ];then
  read -p "请输入你要添加的用户: " NAME
  jian
  useradd $NAME
  echo "123456"| passwd --stdin $NAME
  if [ $? -eq 0 ];then
    echo -e "原始密码为: 33[31m12345633[0m"
  else
    echo "$NAME 用户的初始化密码未成功定义"
  fi
  jia
elif [ $xz == 2 ];then
  read -p "请输入你要删除的用户: " NAME1
  jian
  userdel -r $NAME1
  if [ $? -eq 0 ];then
    echo "$NAME1 用户已删除"
  else
    echo "在删除 $NAME1 时出了点问题"
  fi
  jia
else
  echo "请输入数字1或者数字2..."
fi

欢迎加入QQ群一起讨论Linux、开源等技术

原文地址:https://www.cnblogs.com/smlile-you-me/p/10302735.html