一直都有想要寫相關的紀錄但一直都沒有時間,直到又看到類似應用的工具才想到把之前想要紀錄的通通寫上來
ptrace 在 Linux 上是一個強大的存在,允許一個 process 除錯另外一個 process,像是 GDB 就是基於 ptrace 來運作的
How
看到了有人分享類似 sudohulk、sudo_inject 這種工具,
起初看到描述的時候覺得很神,於是去看了 code 了解一下原理,終究發現是需要使用 ptrace 來達到這種效果,但仍然受限於 Yama Security Module,可以透過更改kernel.yama.ptrace_scope
的數值來決定 ptrace 可以附加的對象,數值及對應效果如下表
數值 | 效果 |
---|---|
0 | 只要有相同的 uid,所有的 process 都可以被 debug |
1 | 只有 parent process 可以 debug 自己的 child process |
2 | 只有管理者可以用 ptrace,需要有 CAP_SYS_PTRACE 能力 |
3 | 沒有 process 可以被 ptrace,啟用後就改不回來了(root 也不行)除非重開機 |
在我慣用的 Linux 發行版裡 (Arch, Ubuntu) 預設至少都有 1,難道有發行版預設是 0 ?
Why
還真的有,一番找尋後發現 debian 8 kernel.yama.ptrace_scope
預設為 0,可能是在這個之後的 debian 預設都是 0
主要是因為三個理由
- 該設定不算是真正的保護,要能用到 ptrace 照理說已經有 shell 存取權限了,在擁有 user 權限的 shell 情況底下,已經可以做多事情了
- 該設定可能會在某些情況下影響除錯應用程式或是 strace 的運作,且在錯誤訊息又不明確與文件不充足的情況下對 bug 回報產生更多阻礙(連用 Google 都可以搜到一堆建議將其設成 0)
- 要是為了安全的話,還是有其他的保護機制可以做到,像是敏感的 process 不要被 attach 到,如同 ssh-agent 那樣
Conclusion
工具縱然有用處,但是前提要是在 kernel.yama.ptrace_scope=0
之下才有可能實現,不過倒是在 sudo_inject
的 exploit_v3.sh
中學到一點
在 sudoers 中最後一行通常是 #includedir /etc/sudoers.d
,首先 sudoer
是有自己的語法的,這裡的 #
並不是註解而是類似 directive,所以代表會將 /etc/suders.d
的內容載入,該攻擊在資料夾中加入一個檔案,設定如下
Defaults !tty_tickets
Defaults timestamp_timeout=-1
如此一來所有的 terminal 將會共用一個 sudo token 並且不會過期,不失為一個維持權限的方法