專屬鏈接
題目:
現在,你拿到了滴滴平臺為你同學生成的專屬登錄鏈接,但是你能進一步拿到專屬他的秘密flag么 提示1:雖然原網站跟本次CTF沒有關系,原網站是www.xiaojukeji.com 注:題目采用springmvc+mybatis編寫,鏈接至其他域名的鏈接與本次CTF無關,請不要攻擊
http://116.85.48.102:5050/welcom/3fca5965sd7b7s4a71s88c7se658165a791e
解答:
首先打開網站,發現是滴滴的官網。。
此時發現所有連接幾乎全部重定向到了滴滴官網。
無奈下查看元素。發現hint
<!--/flag/testflag/yourflag-->
嘗試訪問,http://116.85.48.102:5050/flag/testflag/yourflag發現報錯500,好像是數組越界?
此時嘗試將yourflag替換為DDCTF{1321},返回failed!!!。
猜測爆破flag么?完全沒戲啊。看樣子應該有其他地方可以入手。
然而又發現了主頁js的一句神奇的話。一個ajax語句。
然并卵,404。。。。。
此時只好繼續分析題目,發現了令人眼前一亮的東西。對,就是下面這個icon。

http://116.85.48.102:5050/image/banner/ZmF2aWNvbi5pY28=
訪問后,發現下載了favicon.ico
此時發現圖標好像圖片很奇怪。后來果然驗證了這是個hint。
此時可以愉快地玩耍了,這樣一來,題目源碼有了,還愁拿不下來么。
美滋滋。此時也知道了題目中hint的用意。題目采用springmvc+mybatis編寫
百度搜索springmvc+mybatis文件結構,美滋滋讀文件。
首先,大概知道了資源文件都是在WEB-INF文件夾下,所以猜測這個icon也在這里,此時我們要先確定文件夾。
WEB-INF下有一個web.xml,此時嘗試讀取,最終確定目錄../../WEB-INF/web.xml。
然后拖文件。這里說幾點注意事項。
- 通過../../WEB-INF/web.xml確認位置。
- 繼續根據web.xml中的內容進行文件讀取。classpath是WEB-INF/classes
- 讀class文件時根據包名判斷文件目錄com.didichuxing.ctf.listener.InitListener 即為WEB-INF/com/didichuxing/ctf/listener/InitListener.class
- 制造網站報錯,進一步找到更多的文件
差不多,注意一上四點,就可以拿到盡量多的源碼了。
拖到源碼后,就不美滋滋了。。。還好去年在DDCTF學過2017第二題的安卓逆向,會逆向了。
(此時坑點:jd-jui僅可逆jar,需要將class打成壓縮包改為jar再逆向)
此時開始苦逼的分析源碼。
分析后發現,存在接口,用當前用戶的郵箱去生成一個flag。
但是flag是加密的。此時加密流程代碼里都有,是一個RSA加密。密鑰在服務器中的
此時又一次明白了,為什么讀文件允許ks文件。
來吧,首先先拿郵箱申請一個flag
然而此時申請flag,郵箱也得先加密。自己提取出來的加密腳本如下。
public static String byte2hex(byte[] b)
{
StringBuilder hs = new StringBuilder();
for (int n = 0; (b != null) && (n < b.length); n++)
{
String stmp = Integer.toHexString(b[n] & 0xFF);
if (stmp.length() == 1) {
hs.append('0');
}
hs.append(stmp);
}
return hs.toString().toUpperCase();
}
public static void getEmail() throws NoSuchAlgorithmException, InvalidKeyException{
SecretKeySpec signingKey = new SecretKeySpec("sdl welcome you !".getBytes(), "HmacSHA256");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(signingKey);
String email="3113936212117314317@didichuxing.com";
byte[] e = mac.doFinal(String.valueOf(email.trim()).getBytes());
System.out.println(byte2hex(e));
}
//0DFEE0968F44107479B6CF5784641060DB42952C197C7E8560C2B5F58925FAF4
坑:但是此時后端僅允許post方式。且參數是以get傳遞的。
成功獲取到flag
Encrypted flag : 506920534F89FA62C1125AABE3462F49073AB9F5C2254895534600A9242B8F18D4E420419534118D8CF9C20D07825C4797AF1A169CA83F934EF508F617C300B04242BEEA14AA4BB0F4887494703F6F50E1873708A0FE4C87AC99153DD02EEF7F9906DE120F5895DA7AD134745E032F15D253F1E4DDD6E4BC67CD0CD2314BA32660AB873B3FF067D1F3FF219C21A8B5A67246D9AE5E9437DBDD4E7FAACBA748F58FC059F662D2554AB6377D581F03E4C85BBD8D67AC6626065E2C950B9E7FBE2AEA3071DC0904455375C66A2A3F8FF4691D0C4D76347083A1E596265080FEB30816C522C6BFEA41262240A71CDBA4C02DB4AFD46C7380E2A19B08231397D099FE
然后,解密吧。。
只能百度了,java又不熟,RSA更不熟,尤其還是這種hex的。逆源碼都失敗了。一個勁報錯。(查百度,好像是因為啥空格之類的。打不過打不過)
最終發現一個好玩的,可以從keystore提取RSA私鑰。這樣一來,又繼續美滋滋。
https://blog.csdn.net/zbuger/article/details/51690900
然后照貓畫虎,提出私鑰。此時祭出自己的一個無敵大件。之前從某次CTF安卓題提出的RSA解密腳本。(當時題目簡單,加解密都給了,改個函數名就ok了。)
(╯°□°)╯︵ ┻━┻
要不是在線的解不了。才不會想起這個大招(已放到附件,記得將 密文to ascii 再 to base64。)。。。。。
通過在線工具,提取出公私鑰,然后跑腳本。最終拿到flag。
DDCTF{1797193649441981961}
2018DDCTF-Writeup