Linux攻防快速入门(上)-文本三剑客

1. 为什么云安全课程要学 Bash

  • 最小环境生存能力:云/容器环境常被最小化(无包管理、无网络、无 ifconfig/ip 等),Bash 是几乎总有的交互手段,能用来做探测、横向、自动化。

  • 自动化与编排:补丁、日志收集、自动化检测和响应大量依赖 shell 脚本与命令行工具。

  • 快速原型/POC:很多渗透测试、提权脚本原型先用 Bash 写,能快速验证思路。

  • 日志与文本处理:日志分析与取证高度依赖文本工具(grep/awk/sed),这些都在 Bash 环境下最顺手。

  • 低权限利用:很多“无文件”或不能上传 payload 的场景,可以用 Bash 命令链完成信息泄露或内网探测。


2. 在极简 Docker / 容器里如何做内网探测(不能出网、不能上传文件)

原则:优先使用内置工具(sh/bash、/proc、内核命令、已存在二进制)与“命令链”组合,依赖管道和文本处理,不上传文件。

常用技巧与思路

  1. 查看进程与网络

    • ps auxps -ef(若可用)

    • /proc 下读取:ls /proc/*/fdcat /proc/net/tcpcat /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 -c

        uniq -c:统计相邻相同内容出现的次数。

        注意uniq 只能统计连续重复行,所以通常和 sort 一起使用。这里第二步没有排序,所以可能统计不到全局频率,但在 /proc/net/tcp 中,通常 IP 是有序的,本地连接同一个 IP 会集中在一起。

        输出示例

        3 0100007F 2 0A00020F ...

        表示 0100007F 出现 3 次,0A00020F 出现 2 次。 

        第四部分:

        sort -nr

        -n:按数字排序(这里是出现次数)。

        -r:逆序排序(从大到小)。

  2. 利用已安装的二进制做端口扫描(无 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

  3. ARP / 局域网主机发现

    • 查看 ARP 表:cat /proc/net/arp

    • 若能访问 /sys/class/net/*/address 与 /proc/net/route 可推导子网信息。

  4. DNS / 主机名泄露

    • 查看 /etc/resolv.conf/etc/hosts、环境变量 env | grep -i dns

  5. 横向凭证发现

    • 搜索常见凭证文件:grep -R --line-number -I "password\|passwd\|secret\|token" / 2>/dev/null | head

    • 查环境变量:envcat /proc/1/environ(权限允许时)

  6. 无文件上传场景下的数据回传

    • 如果不允许出网但能写到共享卷/日志,尝试把结果写到已有的可读位置(比如挂载卷、stdout/stderr、应用日志)

  7. 受限 Shell 下的技巧

    • 使用 printfechoddtarbase64(若有)进行数据编码与拼接

    • 如果连 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值