freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Linux shell 实现多服务器SSH一键代理脚本(nc端口转发的定向跳板实现)
FreeBuf_42986 2020-07-03 00:06:33 268413
当需要多级代理到某台机器上,又不希望在每一台机器上搭建繁琐的proxy工具时,这个脚本可以很方便的实现
比如我需要SSH连接到目标服务器T,但是出于网络原因,只能通过 `ServerA->ServerB->ServerC->T` 这样的路径去连接到目标服务器T时,如果我每次都需要 ssh 到每一台机器,是非常头疼的事情。
这个脚本需要使用到两个工具
  • nc (netcat) - 用于端口转发
  • sshpass - 用于自动登陆到跳板服务器
让我觉得非常有意思的是我编写这个脚本时用了一个黑魔法端口转发的方式,详见代码中的 `$comArr` 赋值处。
为了防止密码以明文的方式出现在脚本中,特意做了AES加密处理,在配置`jumpPassAesArr`参数之前,首先使用以下指令,生成对应跳板服务器密码的AES密文
echo -n "{password}" | openssl enc -aes-128-ecb -a -e -pass pass:"{decrypt key}" -nosalt -pbkdf2​

需要配置的参数总共4个,4个参数均为数组,跳板顺序以数组下标递增,4个参数对应配置就可以
jumpHostArr : 服务器的域名或者IP地址
jumpPortArr : 服务器的开放的SSH端口号
jumpUserArr : 对应服务器的用户
jumpPassAesArr : 服务器的密码

代码量不大,直接看吧~
 
#!/bin/bash
##############################################################
#    Copyright (c) 2020 by w0x21. All Rights Reserved.
#    
#    Filename: jumpPorxy.sh
#    Author:w0x21
#    Email: w0x0021@gmail.com
#    Create time: Wed 01 Jul 2020 05:33:00 PM PDT
#    
#    Description:
##############################################################
# Default configure
BindPort=10022
DefaultSleepTime=1
##########################
# Target's information
##########################
TargetHost="target host"
TargetPort=22
##########################
# Jump host's information
##########################
jumpHostArr=("Host1" "Host2" "Host3")
jumpPortArr=(22 22 22)
jumpUserArr=("root" "root" "root")
########################################################################################################
# run `echo -n "password" | openssl enc -aes-128-ecb -a -e -pass pass:"decrypt key" -nosalt -pbkdf2`   #
########################################################################################################
jumpPassAesArr=("AES(Password1)" "AES(Password1)" "AES(Password1)")
jumpPassArr=()
###################
# Decrype password
###################
let index=0
read -p "Please enter AES key: " aes_key
for aes_pass in "${jumpPassAesArr[@]}"
do
    jumpPassArr[$index]=`echo "$aes_pass" | openssl enc -aes-128-ecb -a -d -pass pass:"$aes_key" -nosalt -pbkdf2`
    let index+=1
done
######################
# Build command array
######################
comArr=()
let index_max=${#jumpHostArr[*]}-1
for index in $(seq 0 $index_max)
do
    let index_next=index+1
    if [ x"$index" == x"$index_max" ]; then
        comArr[$index]="nohup nc -l $BindPort >& /dev/tcp/$TargetHost/$TargetPort 0>&1 & sleep $DefaultSleepTime"
    else
        comArr[$index]="nohup nc -l $BindPort >& /dev/tcp/${jumpHostArr[$index_next]}/$BindPort 0>&1 & sleep $DefaultSleepTime"
    fi
done
###################
# Build command
###################
runCom=""
let index_max=${#jumpHostArr[*]}-1
for index in $(seq $index_max -1 0)
do
    loginCom="sshpass -p \"${jumpPassArr[$index]}\" ssh -o StrictHostKeyChecking=no -p ${jumpPortArr[$index]} ${jumpUserArr[$index]}@${jumpHostArr[$index]}"
    runCom="$loginCom \"\$(echo \"`echo \"$runCom${comArr[$index]}\"|base64 -w 0`\"|base64 -d)\";"
done
echo $runCom
echo ""
###################
# Start proxy
###################
bash -c "$runCom"
echo "----------"
if [ $? == 0 ]; then
    echo "Proxy execution succeeded, please connect \"${jumpHostArr[0]}:$BindPort\""
else
    echo "Proxy execution fail."
fi
# 代理 # shell # netcat
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 FreeBuf_42986 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
FreeBuf_42986 LV.2
Blog - https://www.wangsansan.com; CSDN - https://blog.csdn.net/byb123
  • 1 文章数
  • 0 关注者
Typecho install.php存在的反序列化漏洞分析(含EXP)
2017-12-05