HacKerQWQ的博客空间

渗透测试之提权篇一(Linux及Windows提权相关概念)

Word count: 2.2kReading time: 8 min
2020/10/23 Share

提权概念

  • 提权:提高自己在服务器中的权限,主要针对网站入侵过程中,当入侵某一网站时,通过各种漏洞提升WEBSHELL权限以夺得该服务器权限。

Linux概念

Linux内核版本

使用一下命令查看Linux内核版本

1
2
3
4
uname -srm
uname -a
hostnamectl
cat /proc/version

Linux 3.10.0-957.12.2.el7.x86_64 x86_64

  • 3 - 内核版本.
  • 10 - 主修订版本.
  • 0-957 - 次要修订版本.
  • 12 - 补丁版本.

Linux下的用户权限

用户管理

按照UID划分:

  • 0为超级用户root
  • 500-6000为普通用户
  • 1-499为伪用户,不能登录,用于处理系统进程

/etc/passwd

/etc/passwd存储用户的基本信息
例子:

1
2
root:x:0:0:root:/root:/bin/bash
用户名:密码:UID(用户ID):GID(组ID):描述性信息:主目录:默认Shell

其中shell部分:

  • /sbin/nologin不允许登录系统和使用shell
  • /bin/false是最严格的禁止登录选项,一切服务均不能用

修改用户shell

1
usermod -s /bin/false username

/etc/shadow

/etc/shadow是用户口令文件
例子:

1
root:$6$duveWLyJsvTXZE4j$MrFtzxUN9khvw/uoWzIfpjZr/T.1H7InrqckFYMt1fxKh/s7PenGYUznE6EasluKRp1n7xti5jpv6bGmYvwXo.:18544:0:99999:7:::

同 /etc/passwd 文件一样,文件中每行代表一个用户,同样使用 : 作为分隔符,不同之处在于,每行用户信息被划分为 9 个字段。每个字段的含义如下:

1
用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段

其中第二个字段中的数字代表以下加密方式

  • $1 = MD5 hashing algorithm.
  • $2 =Blowfish Algorithm is in use.
  • $2y=eksblowfish Algorithm
  • $5 =SHA-256 Algorithm
  • $6 =SHA-512 Algorithm
  • 空代表可以使用空密码登录

    需要开启/etc/ssh/sshd_config中的PermitEmptyPasswd选项为yes

  • 星号表示账号被锁定

  • 双叹号表示密码已过期

生成密码

  1. openssl

    -6 SHA512-based password algorithm

    -5 SHA256-based password algorithm

    -salt val — Use provided salt

    简单用法

    1
    openssl passwd -6 linux

    自定义salt

    1
    openssl passwd -6 -salt salt linux
  2. mkpasswd

    Available methods:
    sha512crypt SHA-512
    sha256crypt SHA-256
    md5crypt MD5
    descrypt standard 56 bit DES-based crypt(3)

    Example: mkpasswd -m {algo} {password}

    1
    2
    mkpasswd -m md5crypt linux
    # $1$.RDau/ZZ$Bkh4OXLZ6/mk6x2szP.x1/

用户创建及删除

主要用到useradd命令

1
2
3
4
5
useradd [-c comment] [-d home_dir]
[-e expire_date] [-f inactive_time]
[-g initial_group] [-G group[,...]]
[-m [-k skeleton_dir] | -M] [-s shell]
[-u uid [ -o]] [-n] [-r] name
  • -u UID: 手工指定用户的 UID,注意手工添加的用户的 UID 不要小于 500;

  • -d 家目录:手工指定用户的家目录。家目录必须写绝对路径,而且如果需要手工指定家目录,则一定要注意权限;

  • -c 用户说明:手工指定用户说明。还记得 /etc/passwd 文件的第五个字段吗?这里就是指定该字段内容的;

  • -g 组名:手工指定用户的初始组。一般以和用户名相同的组作为用户的初始组,在创建用户时会默认建立初始组。如果不想使用默认初始组,则可以用 -g 手工指定。不建议手工修改;

  • -G 组名:指定用户的附加组。我们把用户加入其他组,一般都使用附加组;

  • -s shell:手工指定用户的登录 Shell。默认是 /bin/bash;

  • -e 曰期:指定用户的失效曰期,格式为”YYYY-MM-DD”。也就是/etc/shadow文件的第八个字段;

  • -o 允许创建的用户的 UID 相同。例如,执行”useradd -u 0 -o usertest”命令建立用户 usertest,它的 UID 和 root 用户的 UID 相同,都是 0;

  • -m 建立用户时强制建立用户的家目录。在建立系统用户时,该选项是默认的;

  • -f 指定在密码过期后多少天即关闭该账号。

  • -M 不要自动建立用户的登入目录。

  • -n 取消建立以用户名称为名的群组。

  • -r 建立系统账号。

  • useradd账号建好之后,再用passwd设定账号的密码。使用useradd命令所建立的账号,实际上是保存在/etc/passwd文本文件中。

操作如下

1
2
3
4
5
#创建用户
useradd -u 0 -o -g root -G roo1 root1
/usr/sbin/useradd -u 0 -o -g root -G root -d /home/test test -p $6$hub$vRlpOJ/sXn8wYsP9FzjYyKt284QTJUmTI56MlQ6/9NIY/aXgy1MvB1elpoHEeApGpobTqgvt8c1FCfJuoULqa0 -s /bin/bash -m
#useradd -u 指定uid -g 指定所属群组 -G 指定所属附加群组 -o 允许创建的uid相同 -d指定用户家目录 -p 指定用户加密后的密码 -s 指定用户shell -m 自动创建家目录(-M 不生成家目录)

删除用户

1
sudo userdel test

用户组管理

组分为私有组标准组,如果创建用户的时候没有指定加入哪个组,就默认创建一个同名私有组

用户组管理文件:/etc/group
例子:

1
test:x:1001:

分为四个部分:

  1. 组名:test
  2. 组口令:一般不使用
  3. 组标识码(GID):1001
  4. 组内用户列表:属于改组的所有用户列表

常见操作

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
#添加用户组
useradd username (默认建立username用户组)
useradd -u 0 -o -g root -G roo1
groupadd 组帐号名称
#修改组名
groupmod -n newName groupName
#删除组账号
groupdel 组帐号名称
注意:删除的帐号必须存在,且不能是某个用户的私有组
#添加用户到组
gpasswd -a userName groupName
#从组中删除用户
gpasswd -d userName groupName
#查看用户属于哪个组
groups userName
#查看某个组有哪些用户
tail 5 /etc/group 最后一行
#查看一个用户的UID和GID
id [options] userName eg: id bruce
id -g userName 只显示GID
id -G userName 显示所有组
id -u userName 只显示UID
#查看用户的相关信息,包括用户的主目录,启动shell,用户名等
finger [options] userName eg: finger bruce
finger -l userName//查基本信息
finger -s userName//查登录状态

sudoers结构

sudoers文件位于/etc/sudoers

sudoers流程

  1. sudo需要输入密码的情况

    当用户执行sudo时,系统会主动寻找/etc/sudoers文件,判断该用户是否有执行sudo的权限
    –>确认用户具有可执行sudo的权限后,让用户输入用户自己的密码确认
    –>若密码输入成功,则开始执行sudo后续的命令

  2. sudo不需要输入密码的情况

    1.root执行sudo时不需要输入密码(eudoers文件中有配置root ALL=(ALL) ALL这样一条规则)
    2.欲切换的身份与执行者的身份相同,不需要输入密码
    3./etc/sudoers文件设置为允许用户在不输入该用户的密码的情况下使用所有命令
    如设置允许wheel用户组中的用户在不输入该用户的密码的情况下使用所有命令
    ( %wheel ALL=(ALL) NOPASSWD: ALL)

sudoers利用

可以通过设置sudoers对普通用户进行提权,比如将普通用户设置为sudo时不需要输入密码即可执行root可执行的权限

1
2
3
4
visudo

vim /etc/sudoers
test ALL=(ALL)NOPASSWD:ALL

image-20210908111749677

Windows概念

Windows下的用户

Windows下用户大概分为以下四种

  • User: 普通用户权限,是系统中最安全的权限(因为分配给该组的默认权限不允许成员修改操作系统的设置或用户资料)。
  • Administrator:管理员权限。可以利用Windows的机制将自己提升为System权限,以便操作SAM文件等。
  • System:系统权限。可以对SAM等敏感文件进行读取,往往需要将Administrator权限提升到System权限才可以对散列值进行Dump操作。
  • TrustedInstaller: Windows 中的最高权限。对系统文件,即使拥有System权限也无法进行修改。只有拥有TrustedInstaller 权限的用户才可以修改系统文件。

低权限级别将使渗透测试受到很多限制。在 Windows 中,如果没有管理员权限,就无法进行获取散列值、安装软件、修改防火墙规则、修改注册表等操作。

Windows操作系统中管理员账号的权限,以及Linux操作系统中root账户的权限,是操作系统的最高权限。提升权限(也称提权)的方式分为以下两类。

  • 纵向提权:低权限角色获得高权限角色的权限。例如,一个 WebShell 权限通过提权,拥有了管理员权限,这种提权就是纵向提权,也称作权限升级。

  • 横向提权:获取同级别角色的权限。例如,在系统A中获取了系统B的权限,这种提权就属于横向提权。
    常用的提权方法有系统内核溢出漏洞提权、数据库提权、错误的系统配置提权、组策略首选项提权、Web 中间件漏洞提权、DLL劫持提权、滥用高权限令牌提权、第三方软件/服务提权等。

提权POC大全

https://github.com/SecWiki/linux-kernel-exploits
http://3xp10it.cc/web/2016/09/18/%E6%8F%90%E6%9D%83/

CATALOG
  1. 1. 提权概念
  2. 2. Linux概念
    1. 2.1. Linux内核版本
    2. 2.2. Linux下的用户权限
      1. 2.2.1. 用户管理
      2. 2.2.2. /etc/passwd
      3. 2.2.3. /etc/shadow
    3. 2.3. 用户创建及删除
      1. 2.3.1. 删除用户
    4. 2.4. 用户组管理
    5. 2.5. sudoers结构
      1. 2.5.1. sudoers流程
      2. 2.5.2. sudoers利用
  3. 3. Windows概念
    1. 3.1. Windows下的用户
  4. 4. 提权POC大全