应急响应-隧道篇
字数 1904 2025-08-22 12:22:36
SSH隧道技术详解与应急响应指南
一、SSH隧道基础
1.1 SSH常用参数
-C:压缩传输,提高传输速度-f:将SSH传输转入后台执行,不占用当前shell-N:静默连接,连接后看不到具体会话-g:允许远程主机连接本地用于转发的端口-L:本地端口转发-R:远程端口转发-D:动态转发(SOCKS代理)-p:指定SSH端口
1.2 隧道类型
-
本地端口转发(Local Port Forwarding)
- 命令格式:
ssh -L <本地端口>:<目标主机>:<目标端口> <跳板机用户>@<跳板机IP> - 特点:从本地端口通过跳板机转发到目标主机端口
- 命令格式:
-
远程端口转发(Remote Port Forwarding)
- 命令格式:
ssh -R <远程端口>:<目标主机>:<目标端口> <攻击机用户>@<攻击机IP> - 特点:将远程端口通过跳板机转发到目标主机端口
- 命令格式:
-
动态转发(Dynamic Forwarding)
- 命令格式:
ssh -D <本地端口> <跳板机用户>@<跳板机IP> - 特点:建立SSH加密的SOCKS代理通道
- 命令格式:
二、Windows环境搭建与隧道技术
2.1 环境配置
- 攻击机:Ubuntu22.04 | 192.168.174.128
- 跳板机:Windows11 | 192.168.174.1/192.168.44.1
- 目标机:win10 | 192.168.44.128
Windows SSH服务端配置:
- 在"应用-可选功能"里安装OpenSSH服务器
- 启动服务:
Start-Service sshd
2.2 隧道建立示例
-
本地转发(攻击机执行):
ssh -Cg -L 2333:192.168.44.128:3389 lenovo@192.168.174.1 -
远程转发:
ssh -CfNg -R 2333:192.168.44.128:3389 hackme@192.168.174.128 -
动态转发:
ssh -CfNg -D 2333 lenovo@192.168.174.1
2.3 Windows应急响应
-
日志检查:
- 跳板机查看
OpenSSH/Operational日志 - 目标机检查RDP相关日志:
Microsoft-Windows-RemoteDesktopServices-RdpCoreTS/OperationalMicrosoft-Windows-TerminalServices-LocalSessionManager/Operational
- 跳板机查看
-
网络连接检查:
netstat -ano | find "ESTABLISHED"- 注意SSH服务的PID
-
流量分析:
- 跳板机与目标机之间:TPKT协议(RDP基于TPKT)
- 攻击机与跳板机之间:明显的SSH流量
- 注意RDP流量中的
mstshash参数(如mstshash=hackme)
三、Linux环境搭建与隧道技术
3.1 环境配置
- 攻击机:Ubuntu22.04 | 192.168.174.128
- 跳板机:ubuntu20.04 | 192.168.44.130/192.168.174.129
- 目标机:kali | 192.168.44.129
3.2 隧道建立示例
远程转发:
ssh -CfNg -R 2333:192.168.44.129:22 hackme@192.168.174.128
3.3 Linux应急响应
-
进程检查:
pstree -agplU | grep ssh- 查找反向连接的命令
-
日志检查:
- 检查
/var/log/auth.log - 注意:远程隧道转发不会在跳板机留下SSH登录日志
- 检查
-
历史命令检查:
history- 远程转发时,目标机的history会记录在攻击机连接时执行的命令
-
登录日志检查:
last- 会留下登录日志(显示登录的是跳板机的IP)
四、SSH流量分析与解密
4.1 流量分析难点
现代OpenSSH高版本流量中不再包含秘钥、IV等值,需要在内存中获取
4.2 密钥恢复工具
-
OpenSSH-Session-Key-Recovery:
- 从内存中提取SSH会话密钥
- 安装:
git clone https://github.com/fox-it/OpenSSH-Session-Key-Recovery.git sudo apt-get install python3-ptrace python3 key.py
-
OpenSSH-Network-Parser:
- SSH流量解析器
- 安装步骤:
git clone https://github.com/fox-it/OpenSSH-Network-Parser.git # 修改setup.py,删除setup_requires=['setuptools_scm'] pip2 install dissect.cstruct==1.0.0 pip2 install psutil pip2 install tabulate pip2 install libnacl pip2 install cryptography sudo apt-get install python2.7-dev pip2 install gevent-1.2.0-cp27-cp27mu-manylinux1_x86_64.whl git clone https://github.com/MITRECND/pynids cd pynids/dist/ tar zxvf pynids-0.6.2.tar.gz sudo apt-get install libnet-dev sudo apt-get install libpcap-dev sudo apt-get install libnids-dev cd pynids-0.6.2/ sudo python2 setup.py install cd OpenSSH-Network-Parser sudo python2 setup.py install
4.3 解密流程
- 使用
OpenSSH-Session-Key-Recovery获取密钥信息 - 将输出保存到
/OpenSSH-Network-Parser/example/keys.json - 捕获的流量放在同一目录
- 执行
example.sh - 解密后的流量查看
tmp/ssh目录
示例密钥输出格式:
{
"pid": 21359,
"proc_name": "sshd",
"sshenc_addr": 93956943803936,
"cipher_name": "chacha20-poly1305@openssh.com",
"key": "3a065eca4ae68ef8b6db218c417b0a363891255e4af3411714a269f9a0617c63c18eec809ce2dc5dd94a649662acea93d082fea03f3a89c5bfce2c8de92a8a01",
"iv": "",
"sshenc": {
"name": 93956943831104,
"cipher": 93956921986280,
"enabled": 0,
"key_len": 64,
"iv_len": 0,
"block_size": 8,
"key": 93956943762240,
"iv": 93956943863360
},
"network_connections": [
{
"family": 2,
"fd": 4,
"laddr": ["192.168.44.129", 22],
"raddr": ["192.168.44.130", 47772],
"status": "ESTABLISHED",
"type": 1
}
]
}
五、总结与防御建议
5.1 隧道检测关键点
-
Windows环境:
- 跳板机的SSH日志(不明IP连接)
- 网络连接(监听转发式的连接)
- 流量特征(不明IP和mstshash)
-
Linux环境:
- 进程树中的SSH命令
- 历史命令记录
- 登录日志
5.2 防御措施
- 限制SSH访问IP
- 监控异常端口转发
- 定期检查网络连接
- 启用详细的SSH日志记录
- 对SSH服务进行行为监控
5.3 应急响应流程
- 检查网络连接和进程
- 分析相关日志
- 捕获网络流量
- 必要时进行内存取证获取SSH会话密钥
- 解密分析SSH流量内容