linux内网渗透
拿到一台Linux跳板机,网渗第一件事不是网渗急着扫内网,而是网渗看清楚自己站在什么位置。`ip a`、网渗`route -n`、网渗`cat /etc/resolv.conf`,网渗这三条命令基本能勾勒出当前主机所处的网渗网络拓扑。很多时候你拿下的网渗机器双网卡,一张对外,网渗一张对内,网渗那就是网渗天然的 pivoting 节点。
假设目标内网是网渗 10.10.10.0/24,攻击机在 192.168.1.0/24 段。网渗最省事的网渗办法是用 SSH 动态转发:
ssh -D 1080 user@10.10.10.5 然后本地 proxychains 配置指向 127.0.0.1:1080,nmap 就能直接扫内网了。网渗但 proxychains 有个毛病——ICMP 走不了,ping 不通不代表主机不在线。我一般配合 `nmap -sT -Pn` 用,TCP connect 扫描虽然慢,但穿透代理最稳。
如果跳板机没有 SSH 密码,只有 webshell 呢?那就得靠 reGeorg 或者 Neo-reGeorg 这类工具,把 socks 代理通过 HTTP 隧道拉出来。Neo-reGeorg 比老版本好用得多,支持 AES 加密流量,不容易被 IDS 识别。上传 tunnel.jsp 或 tunnel.php 到目标 web 目录,本地跑:
python neoreg.py -k password -u http://target/tunnel.php 它会本地监听 1080 端口,后面的操作和 SSH 动态转发一样。
代理通了之后,信息收集才是重头戏。内网里最值钱的东西往往不是那些开放了一堆端口的大块头,而是几台不起眼的 Redis 或者 MySQL。我遇到过好几次,一台 CentOS 7 上跑着 Redis 6.0,没设密码,bind 0.0.0.0,protected-mode 还关着。这种机器基本等于送分。写 SSH key 进去:
redis-cli -h 10.10.10.22 config set dir /root/.ssh config set dbfilename authorized_keys set x "\n\nssh-rsa AAAA...\n\n" save 直接 SSH 登录,连提权都省了。
MySQL 的情况类似。UDF 提权虽然老,但在 MySQL 5.x 上依然好用。前提是知道 root 密码,或者有 FILE 权限。`select @@version` 和 `select current_user()` 先看清楚版本和权限,再决定走 UDF 还是写日志文件。
横向移动这块,Linux 内网比 Windows 简单,没那么多域控和票据。核心就是找 SSH 密钥、找已知密码、找配置文件里的凭证。`/root/.ssh/` 目录、`.bash_history`、`/etc/fstab` 里的挂载凭证、web 目录下的 config.php,这些地方翻一遍,经常有惊喜。有一次我在一台 web 服务器的 `/var/www/html/.env` 里翻到数据库密码,用这个密码直接 SSH 到了内网另一台数据库服务器,因为运维图省事,所有机器密码一样。
权限维持方面,crontab 反弹 shell 是最常见的。但要注意,很多内网机器出不了外网,反弹到公网 IP 根本连不上。这时候得把 shell 弹到已经控制的跳板机上,再通过代理转发出来。或者更隐蔽一点,写一个 systemd service,伪装成正常服务名,比如 `systemd-networkd-helper.service`,一般人不会去细看。
清理痕迹这件事,说实话,在实战中优先级没那么高。除非你有明确的免杀和反取证需求,否则把 `.bash_history` 清掉、日志里自己的 IP 抹掉基本够了。`/var/log/secure`、`/var/log/auth.log`、`/var/log/wtmp`,这几个文件重点关注。但别把日志全删了,那等于告诉管理员“有人来过”。
最后说个容易被忽略的点:内网里的 Docker 容器。很多运维把容器当虚拟机用,容器里跑着 SSH,密码还是弱口令。通过代理扫到 2375 端口开放的话,直接 `docker -H tcp://10.10.10.30:2375 ps`,连容器逃逸都省了,直接在里面操作。这种配置在内网环境里出奇地常见,尤其是那些用 Rancher 或者 Portainer 管理的中小规模集群。
(责任编辑:热点)
