1. 为什么云安全课程要学 Bash?
-
最小环境生存能力:云/容器环境常被最小化(无包管理、无网络、无 ifconfig/ip 等),Bash 是几乎总有的交互手段,能用来做探测、横向、自动化。
-
自动化与编排:补丁、日志收集、自动化检测和响应大量依赖 shell 脚本与命令行工具。
-
快速原型/POC:很多渗透测试、提权脚本原型先用 Bash 写,能快速验证思路。
-
日志与文本处理:日志分析与取证高度依赖文本工具(grep/awk/sed),这些都在 Bash 环境下最顺手。
-
低权限利用:很多“无文件”或不能上传 payload 的场景,可以用 Bash 命令链完成信息泄露或内网探测。
2. 在极简 Docker / 容器里如何做内网探测(不能出网、不能上传文件)
原则:优先使用内置工具(sh/bash、/proc、内核命令、已存在二进制)与“命令链”组合,依赖管道和文本处理,不上传文件。
常用技巧与思路
-
查看进程与网络
-
ps aux、ps -ef(若可用) -
/proc下读取:ls /proc/*/fd、cat /proc/net/tcp、cat /proc/net/arp -
ss -ntp(若有)或netstat -ant(有时容器没有)-
示例:查看已建立连接的远端 IP:
awk '/^ *[0-9]+: /{print $2}' /proc/net/tcp | \ awk -F: '{print $1}' | uniq -c | sort -nr | head -n 20第一部分:
awk '/^ *[0-9]+: /{print $2}' /proc/net/tcp/proc/net/tcp:Linux 下保存 TCP 连接信息的虚拟文件。awk '/^ *[0-9]+: /{print $2}':^ *[0-9]+::匹配行首的编号,例如0:、1:、12:等。{print $2}:打印第二列(默认按空格分列)。在/proc/net/tcp中,第二列通常是 本地地址:端口,例如0100007F:0035(十六进制的 IP:端口)。输出示例:0100007F:0035 0A00020F:01BB ...第二部分:
awk -F: '{print $1}'-F::将冒号:作为字段分隔符。{print $1}:只打印冒号前面的部分,也就是 本地 IP(十六进制)。输出示例:
0100007F 0A00020F ...第三部分:
uniq -cuniq -c:统计相邻相同内容出现的次数。注意:
uniq只能统计连续重复行,所以通常和sort一起使用。这里第二步没有排序,所以可能统计不到全局频率,但在/proc/net/tcp中,通常 IP 是有序的,本地连接同一个 IP 会集中在一起。输出示例:
3 0100007F 2 0A00020F ...表示
0100007F出现 3 次,0A00020F出现 2 次。第四部分:
sort -nr-n:按数字排序(这里是出现次数)。-r:逆序排序(从大到小)。
-
-
-
利用已安装的二进制做端口扫描(无 nmap)
-
bash+/dev/tcp(Bash内建):for p in 1 22 80 443 8080 9000; do (echo >/dev/tcp/192.168.1.1/$p) >/dev/null 2>&1 && echo "open $p" done -
nc(若存在)也可用:nc -z -v 192.168.1.1 1-1024
-
-
ARP / 局域网主机发现
-
查看 ARP 表:
cat /proc/net/arp -
若能访问 /sys/class/net/*/address 与 /proc/net/route 可推导子网信息。
-
-
DNS / 主机名泄露
-
查看
/etc/resolv.conf、/etc/hosts、环境变量env | grep -i dns
-
-
横向凭证发现
-
搜索常见凭证文件:
grep -R --line-number -I "password\|passwd\|secret\|token" / 2>/dev/null | head -
查环境变量:
env或cat /proc/1/environ(权限允许时)
-
-
无文件上传场景下的数据回传
-
如果不允许出网但能写到共享卷/日志,尝试把结果写到已有的可读位置(比如挂载卷、stdout/stderr、应用日志)
-
-
受限 Shell 下的技巧
-
使用
printf、echo、dd、tar、base64(若有)进行数据编码与拼接 -
如果连
bash的/dev/tcp不可用,可通过awk的 socket(gawk)或python/perl(若存在)做网络交互
-
3. 文本三剑客:grep / sed / awk — 总体说明
-
三者定位:
-
grep:快速搜索过滤,行级匹配。 -
sed:流编辑器,可做替换/删除/插入/打印(行级、逐行处理)。 -
awk:字段处理与逻辑、统计与简单脚本化(行->字段->操作),适合报表与列处理。
-
-
三者组合是日志取证、流量分析、提取与统计的利器。
4. grep 详解(常用选项与示例)
常用选项:
-
-v:反向匹配(显示不匹配的行) -
-i:忽略大小写 -
-n:显示匹配行号 -
-c:只输出匹配行数 -
-o:只输出匹配到的文本片段(而不是整行) -
-q:静默模式(用于脚本检测存在性) -
-P:Perl 正则(如果支持) -
-E:扩展正则
示例与一行命令:
-
查找已建立(ESTABLISHED)的远端 IP,统计出现次数,取前 3:
ss -nt | grep ESTAB | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -n3 -
过滤掉空行与
#注释行:grep -v -E '^\s*$|^\s*#' /etc/profile
-
从
ifconfig(或ip a)中提取 IPv4 地址(兼顾不同系统):ip -4 addr show 2>/dev/null | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | head -n1或(如果只有
ifconfig):ifconfig 2>/dev/null | grep -oE 'inet (addr:)?([0-9]{1,3}\.){3}[0-9]{1,3}' | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}'
5. sed 详解(原理、常用命令与注意)
原理(简短)
-
sed读取一行(模式空间),对其应用脚本,并输出(除非用-n禁止自动打印)。 -
支持按地址(行号或正则)操作,能做替换、删除、插入等。
常用选项
-
-n:只输出显式p打印的内容;不自动打印每行,只在匹配成功时输出 -
-e script:多脚本编辑 -
-f scriptfile:从文件读取脚本 -
-E或-r:使用扩展正则(不同 sed 选项名可能不同) -
-i[.bak]:直接修改文件并可备份.bak -
-s:把多个文件看作独立
常用命令
-
替换:
s/pat/repl/g -
删除行:
d -
插入:
i\text -
追加:
a\text -
打印:
p
示例
-
打印第 1 行:
sed -n '1p' /etc/issue.bak -
打印最后一行:
sed -n '$p' /etc/passwd -
删除所有以
#开头的行并就地保存(备份原文件):sed -ri.bak '/^\s*#/d' /etc/fstab -
从 ifconfig 输出提取 IP(示例):
ifconfig ens33 2>/dev/null | sed -nr 's/.*inet (addr:)?([0-9.]+).*/\2/p' | head -n1 -
批量替换日志中某 IP(伪造/清理痕迹注意合规):
sed -i 's/192\.168\.1\.3/192.168.1.4/g' /var/log/apache/access.log
注意事项
-
-i在不同 sed 实现有差异(GNU sed 支持-i.bak,BSD sed 可能要求-i '')。 -
正则要转义
.、/、&等特殊符号。 -
sed对二进制文件不友好,主要用于文本。
6. awk 详解(内置变量、常用用法与示例)
核心思想
-
awk把每行按字段分割(默认 FS 是空白),对字段/行执行动作,非常适合日志分析与列操作。 -
awk更像一门小脚本语言,支持条件、循环与用户变量。
常用选项/写法
-
-F:指定字段分隔符,例如-F':' -
-v var=val:传入外部变量 -
-f scriptfile:从脚本文件读取命令
内置变量
-
NF:字段数 -
NR:行号(全局) -
$0:整行,$1、$2:第1、第2字段
常用示例
-
打印
/etc/passwd的整行(用:分隔):awk -F: '{print $0}' /etc/passwd -
从
ss日志取远端 IP 并统计前 3:awk -F"[ :]+" '/ESTAB/{print $(NF-1)}' ss.log | cut -d: -f1 | sort | uniq -c | sort -nr | head -n3 -
统计 POST 请求来源 IP:
grep 'POST' /var/log/httpd/access_log | awk '{print $1}' | sort | uniq -c | sort -nr | head -
过滤 Content-Length > 5M(假设第10列是长度):
awk '$10 > 5000000 {print $0}' /var/log/httpd/access_log -
/etc/passwd中 UID >= 500 的用户:awk -F: '$3 >= 500 {print $1":"$3}' /etc/passwd -
列出所有进程的 swap 使用(从
/proc/*/status):for f in /proc/*/status; do awk '/VmSwap/{printf "%s %s\n", FILENAME, $2}' "$f"; done -
查看 root 用户:
awk -F: '$3==0{print $1}' /etc/passwd
7. 三剑客常见组合模式(一行命令范例)
-
过滤日志去掉注释/空行、取第 1 列并统计:
sed -n '/^\s*#/d; /^\s*$/d; p' file.log | awk '{print $1}' | sort | uniq -c | sort -nr -
查找特定时间窗口内的请求并汇总 IP:
awk '$4 ~ /\[01\/Sep\/2025/ {print $1}' /var/log/httpd/access_log | sort | uniq -c | sort -nr -
从复杂输出中提取 IPv4 并去重:
grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' file | sort -u

1179

被折叠的 条评论
为什么被折叠?



