摘要:出題思路本次題目來自于我的一個(gè)外包項(xiàng)目實(shí)踐。回合制比賽以分鐘為一回合。選手在比賽過程中需要盜取到對(duì)手的密鑰,以竊聽他方內(nèi)容,并修改己方密鑰以放泄露動(dòng)態(tài)該部分同樣由中心服務(wù)器與完成。
Author: Rytia背景
Date: 20190427
Blog: www.zzfly.net
本人才學(xué)疏淺,望君不吝賜教
受學(xué)校老師邀請(qǐng),為學(xué)弟學(xué)妹舉辦分享會(huì)介紹 AWD 相關(guān)經(jīng)驗(yàn),本人一時(shí)頭腦風(fēng)暴采用 PHP 的 Swoole 擴(kuò)展搭建了比賽的環(huán)境,將分享會(huì)變成了友誼賽。
出題思路本次題目來自于我的一個(gè)外包項(xiàng)目實(shí)踐。項(xiàng)目里面大致有這么一個(gè)需求:客戶登錄系統(tǒng)后,由外部設(shè)備觸發(fā)一個(gè) websocket 發(fā)送操作(例如嵌入式中常遇見的“打開門禁”、“滴卡”、“按下開關(guān)”等),該請(qǐng)求接收方為某個(gè)已經(jīng)登陸的某個(gè)用戶(通常靠 user id 或用戶名綁定)。本人在初次開發(fā)這類應(yīng)用時(shí),將用戶唯一身份標(biāo)識(shí)的 user id 作為了這個(gè) websocket 通道的名字,如此一來帶來的后果便是無論這個(gè)用戶在哪臺(tái)電腦登錄,無論用戶登陸多少次(小項(xiàng)目無重復(fù)登陸+擠下線判斷),只要成功登錄并打開相應(yīng)網(wǎng)頁便會(huì)收到這個(gè) websocket 請(qǐng)求,帶來了某些非預(yù)期的信息泄露。在實(shí)際的項(xiàng)目中解決方法有很多,例如重復(fù)登陸的判斷以及 websocket “匿名通道”建立。本次出題,便以此為基礎(chǔ)展開
AWD 運(yùn)作原理CTF-AWD 是線下賽中常見的比賽類型,通常因?yàn)楣ナ丶鎮(zhèn)涠鴱V受選手喜愛。這里我主要實(shí)現(xiàn)了 AWD 兩大關(guān)鍵功能:回合制 、 存活檢測 與 動(dòng)態(tài) flag,至于 flag 提交等前端部分內(nèi)容,則交由我校 GOCTF 平臺(tái)處理。
回合制:比賽以 10 分鐘為一回合。在中心服務(wù)器方面,事先使用腳本,根據(jù)已開啟的靶機(jī)數(shù)量以及 ip 生成 flag 并保存為文件,并于比賽開始時(shí)記錄開始時(shí)間。每次中心服務(wù)器接收到選手靶機(jī)的請(qǐng)求時(shí),根據(jù)靶機(jī)的 ip,以及距離比賽開始的時(shí)間,計(jì)算出當(dāng)前處于第幾個(gè)回合,并返回 flag 數(shù)組中相應(yīng)的值。而在 pusher (一個(gè)第三方 websocket 工具,可以為 cli 運(yùn)行的腳本語言提供發(fā)送 websocket 的能力,本次出題依賴 pusher 進(jìn)行),同樣以 10 分鐘為一回合,主動(dòng)向選手端推送含有比賽關(guān)鍵內(nèi)容的消息
存活檢測:本次平臺(tái)存貨監(jiān)控設(shè)置的比較簡單,主要為 web 服務(wù)(靶機(jī) 80 端口)的監(jiān)控。每隔一段時(shí)間向靶機(jī)發(fā)送 http 請(qǐng)求,下載靶機(jī)上某個(gè)保存著 pusher 密鑰的 js 文件,若該文件大小符合預(yù)期,則判定靶機(jī)存活。選手在比賽過程中需要盜取到對(duì)手的密鑰,以竊聽他方 websocket 內(nèi)容,并修改己方 pusher 密鑰以放泄露
動(dòng)態(tài) flag:該部分同樣由中心服務(wù)器與 pusher 完成。中心服務(wù)器在被請(qǐng)求時(shí)根據(jù)時(shí)間不同(回合不同)向選手返回不同 flag。pusher 根據(jù)時(shí)間不同(回合不同)主動(dòng)推送不同的 flag 到選手的頁面上。
AWD 缺陷總結(jié)本次比賽完成之后,發(fā)現(xiàn)這套平臺(tái)想要真正用于日常選手的訓(xùn)練還有幾個(gè)問題需要克服
由于學(xué)校 GOCTF 平臺(tái)截止比賽時(shí)仍未能很好的支持動(dòng)態(tài) flag 功能,因此根據(jù)每一回合中心服務(wù)器主動(dòng)通知CTFF平臺(tái) flag 變更的功能無法實(shí)現(xiàn),只能暫時(shí)讓選手記錄自己的 flag 233333….TAT
時(shí)鐘難以統(tǒng)一。因?yàn)?pusher 和 AWD 中心服務(wù)器不一定運(yùn)行在同一臺(tái)服務(wù)器上,且中心服務(wù)器為被- 動(dòng)接收數(shù)據(jù),pusher 為主動(dòng)推送,加之啟動(dòng)時(shí)間先后有別,因此每個(gè)回合難以做到完全統(tǒng)一。往后如果需要再次制作 AWD 比賽平臺(tái)可以加一個(gè)定時(shí)心跳包以保證時(shí)鐘統(tǒng)一
Writeup介紹完比賽平臺(tái)的基本運(yùn)作思路,下面簡單講解一下這道 AWD 題目的做法。
攻訪問 80 端口,注冊多個(gè)用戶,登陸系統(tǒng)后,發(fā)現(xiàn) User ID 為1的用戶已經(jīng)注冊,且系統(tǒng)提示一定要以 User ID 為 2 的用戶登錄
登錄到 User ID 為 2 的用戶后,發(fā)現(xiàn)頁面啟動(dòng)了 websocket ,隧道名稱為 user.2。切換到其他用戶后均發(fā)現(xiàn)隧道名稱為 user. (為當(dāng)前用戶登錄 id) 的 websocket 鏈接
每一回合,發(fā)現(xiàn)被主動(dòng)以彈窗形式提醒了“比賽消息”,且“比賽消息”中包含 flag1,但是彈窗出現(xiàn)后2秒內(nèi)強(qiáng)制跳轉(zhuǎn)到了用戶注銷頁面(暗示含有XSS)
登錄服務(wù)器后臺(tái),修改視圖文件( home.blade.php ),將底部 JS 部分中當(dāng)前用戶 ID 的輸出 user.{{Auth::user()->id}} 修改為 user.1 (表示強(qiáng)制接收 user.1 隧道的消息)
下一回合推送,接收到了 user.1 的消息,得到 flag2,且 flag2 以 = 結(jié)束,像 base64 編碼,解碼后得出 (保密) 賬戶的密碼的 rot13 值,重新進(jìn)行 rot13 旋轉(zhuǎn)后得到正確密碼
以 (保密) 管理員身份登錄后,發(fā)現(xiàn)有頭像上傳的模塊,且僅做了前端校驗(yàn),burpsuit 修改請(qǐng)求中的文件名即可上傳PHP“菜刀”,得到系統(tǒng) shell,且用戶為 root
了解整個(gè)過程后,發(fā)現(xiàn) pusher.js 中含有 pusher 賬戶的密鑰,且這個(gè)文件可以在80端口輕松下載,因此每臺(tái)靶機(jī)都存在泄露問題。得到對(duì)手的 pusher 密鑰后,修改到自己的服務(wù)器上即可接收到對(duì)手的 user.1 隧道中的消息,獲取到對(duì)手的 (保密) 管理員賬號(hào)密碼,從而利用文件上傳漏洞 get shell。
除了常規(guī)的備份、上監(jiān)控、源碼審計(jì)外,主要有以下幾點(diǎn)解題思路。
主線/root 目錄下存在 readme.txt,提示從歷史命令記錄里尋找入口點(diǎn)
發(fā)現(xiàn)以下兩條命令可疑:curl 172.17.0.1 和 php artisan tinker
使用 `ip addr 命令發(fā)現(xiàn)與前條命令處于同一網(wǎng)段,猜測是向中心服務(wù)器發(fā)起請(qǐng)求
進(jìn)行 curl 測試發(fā)現(xiàn)無此命令,且 apt、yum 等工具均為無效,使用 cat /etc/issue 查看到當(dāng)前系統(tǒng)為 alpine linux,因此使用 apk add curl 命令安裝 curl 工具,正常請(qǐng)求后得到 flag3
根據(jù)比賽規(guī)則,flag3 為動(dòng)態(tài) flag,每回合變動(dòng)一次,且不能提交自己靶機(jī)上的,因此可以按照這個(gè)思路去配合負(fù)責(zé)進(jìn)攻部分的隊(duì)友完成對(duì)方靶機(jī)的滲透
php artisan tinker 命令為賽題所用 Laravel 框架對(duì) psy shell 的封裝,可以直接進(jìn)入 psy shell 通過 ORM 操作修改管理員賬戶的密碼,從而獲取自己靶機(jī)的管理員權(quán)限,與上文所述修改 user id 以竊聽 websocket 的效果相似,但是難度比較大,也不太符合預(yù)期關(guān)于 websocket 的考點(diǎn)
每個(gè)回合接收到彈窗,都會(huì)被強(qiáng)制跳轉(zhuǎn)到“注銷”頁面,推測有 XSS 漏洞,進(jìn)行源碼審計(jì)后,將 resources/views/home.blade.php 文件中 $(“”).html(data.message) 修改為 $(“”).text(data.message) 即可不解析推送內(nèi)容以放推送 XSS 投毒(仰天大笑~)
源碼審計(jì)發(fā)現(xiàn)存在 upload() 方法用于處理 /upload 這個(gè) url 下的文件上傳操作,且不對(duì)擴(kuò)展名、mine type 等進(jìn)行判斷, 可以給對(duì)手的服務(wù)器嘗試強(qiáng)制上傳文件。但是 Laravel 框架默認(rèn)開啟 csrf 攔截,需要在對(duì)手服務(wù)器上注冊一個(gè)賬號(hào)以獲取 csrf token
https://github.com/zzfly256/C...
運(yùn)行環(huán)境AWD 平臺(tái)部分:PHP 7 + Swoole 4
靶機(jī)部分:任意版本 docker
server:AWD 中心服務(wù)器,運(yùn)行于 docker 母機(jī),負(fù)責(zé)根據(jù)提供每個(gè)回合的 flag:flag3
getFlag 文件為 php 可執(zhí)行文件,根據(jù) docker ps 命令中的啟動(dòng)的容器的 ip,為容器生成不同的 flag 并保存為 flags.json
server 文件為 php 可執(zhí)行文件,監(jiān)聽 80 端口,根據(jù)不同回合返回 flags.json 文件中的相應(yīng)值
flags.json 保存生成的 flag
pusher:Pusher.js 的服務(wù)端,運(yùn)行于 docker 母雞或任何一臺(tái)電腦。關(guān)于 pusher 的介紹可移步官網(wǎng):www.pusher.com
pusher-admin 文件為 php 可執(zhí)行文件,為賽題中管理員用戶推送消息(供選手竊聽 websocket,包含一個(gè) flag :flag2)
pusher-user 文件為 php 可執(zhí)行文件,為賽題中(ID為 2 )的普通注冊用戶推送消息(包含一個(gè) flag : flag1)
monitor 文件為 php 可執(zhí)行文件,用于監(jiān)控選手靶機(jī)是否存活(監(jiān)控 web 服務(wù)/ pusher.js 文件大小)
pusher-server 文件為 php 可執(zhí)行文件,按照回合(時(shí)間)推送消息以及存活檢測
getFlag 文件為 php 可執(zhí)行文件,生成管理員消息(flag2)所用
pusher-key.json 保存各個(gè)靶機(jī)的 pusher 密鑰,以及 flag2 的值(flag1的值為固定值,每個(gè)選手一樣)
web:比賽賽題企業(yè)網(wǎng)站部分, 是為 laravel 5.8 框架,采用 sqlite 數(shù)據(jù)庫
業(yè)務(wù)邏輯主要在 /app/Http/Controllers/HomeController.php
視圖文件在 /resources/views 目錄下
docker:靶機(jī) docker 鏡像
更多更多關(guān)于本項(xiàng)目的介紹,可以移步:http://www.zzfly.net/build-a-...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/31420.html
摘要:的機(jī)器學(xué)習(xí)庫的機(jī)器學(xué)習(xí)庫,包括算法交叉驗(yàn)證神經(jīng)網(wǎng)絡(luò)等內(nèi)容。在即將到來的大會(huì)上,她將和大家分享在機(jī)器學(xué)習(xí)領(lǐng)域的全新可能。入門總結(jié)入門相關(guān),如安裝配置基本使用等。 基于 Swoole 開發(fā) PHP 擴(kuò)展 Swoole-1.9.7 增加了一個(gè)新特性,可以基于 Swoole 使用 C++ 語言開發(fā)擴(kuò)展模塊,在擴(kuò)展模塊中可以注冊 PHP 內(nèi)置函數(shù)和類。現(xiàn)在可以基于 Swoole 來編寫 PHP ...
閱讀 2116·2021-11-24 10:28
閱讀 1138·2021-10-12 10:12
閱讀 3345·2021-09-22 15:21
閱讀 687·2021-08-30 09:44
閱讀 1903·2021-07-23 11:20
閱讀 1152·2019-08-30 15:56
閱讀 1763·2019-08-30 15:44
閱讀 1487·2019-08-30 13:55