前几天买了个树莓派3b,实现远程控制自然要有内网转发,没什么毛病,但是任何事情我遇到的问题总比别人多,下面就开始折腾了。

一开始装的是树莓派的原生系统,花生壳官网有树莓派专用的客户端也就是arm版,但是用着用着很多渗透软件装着太麻烦,于是换了kali系统,

那么问题来了,花生壳没有适用的客户端了,所以只能想用自己的软件转发,当然最简单的就是lcx转发端口( linux下内网端口转发工具:linux版lcx [实现远程内网维护]),但是这种工具从稳定性角度考虑的话只能作为临时方案。

终究还是选择了ngrok这个内网转发工具,网上教程不少,也基本上都成功了,但是我折腾了两天,当然,我的操作是没有问题的,出于不甘心的态度,别人不怎么会linux的都能搞定,我没理由搞不定,于是死撑到昨晚,终于各种google解决了一个最大的问题。

那么这个问题就是,网上所给的那些ngrok.cfg配置文件 根本不生效。

教程精简版

高度概括下ngrok的使用方法,也算是给自己的一个备忘。

客户端:

ngrok.cfg
server_addr: xxx.vuln.cn:4443
trust_host_root_certs: false
tunnels:
    http:
        proto:
            http: 80
        subdomain: pi
    ssh:
        remote_port: 2222
        proto:
            tcp: 22
./ngrok -config=ngrok.cfg start ssh
注意:缩进需要使用四个空格替代tab
这个配置文件为核心,支持多端口同时转发,亲测可用,我也就是被网上的那些配置文件坑了。
如果要同时开始80 和22端口转发 就start ssh http即可

服务端:

./ngrokd -domain="xxx.vuln.cn" -httpAddr=":1222" -httpsAddr=":443"
说明:这里的httpaddr是单独用来转发80的,所以如果其他tcp端口,服务端不需要指定,由客户端指定,服务端不占用即可。

出现的那些问题

第一个问题:

那么我遇到最大的一个问题就是,客户端根本不请求在ngrok.cfg里指定的域名,所以就会导致客户端一直处于reconnecting状态,

从转包数据可以看到:

请求的一直都是go源码中指定的默认域名,所以,网上给的配置文件:

server_addr:xxx.vuln.cn:4443
trust_host_root_certs: false

是有问题的,server_addr根本不生效,可能与版本有关。

使用上面提供的配置文件后,完美转发本地22端口:

第二个问题:

go语言的安装也是折腾的够了,网上的教程基本上都是下载go源码包来编译,可是正当我崩溃的不想玩的时候,发现官网有现成的arm版本

树莓派这个版本可以直接用:https://storage.googleapis.com/golang/go1.7.4.linux-armv6l.tar.gz

注意:go版本必须要1.7版本或以上,很多1.3,1.4后面编译ngrok客户端的时候会报错。

完整教程

完整的教程网上很多,在这里我也直接把网上的教程拿过来,纠正一些地方贴上来。

声明编译的路径和必要的域名(域名改成你自己的)
git clone https://github.com/inconshreveable/ngrok.git ngrok
#或者:
git clone https://github.com/tutumcloud/ngrok.git ngrok
export GOPATH=/usr/loca/ngrok/
export NGROK_DOMAIN="xxx.vuln.cn"
cd /usr/local/ngrok

生成证书,Ngrok会使用此证书加密通讯

openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem
openssl genrsa -out server.key 2048openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr
openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000

将证书文件复制到指定位置

cp rootCA.pem assets/client/tls/ngrokroot.crt -i
cp server.crt assets/server/tls/snakeoil.crt -i
cp server.key assets/server/tls/snakeoil.key -i

编译服务器端与客户端

服务器端为linux-x86-64

export GOOS=linux
export GOARCH=386
make release-server

编译完成过后~/ngrok/bin/ngrokd即为服务端运行文件

运行:

./ngrokd -domain="xxx.vuln.cn" -httpAddr=":1222" -httpsAddr=":443"

客户端
树莓派为linux-arm架构,重新声明go env里的变量

export GOOS=linux export GOARCH=arm make release-client

编译完成过后~/ngrok/bin/linux_arm/ngrok即为树莓派客户端运行文件
客户端配置文件:

ngrok.cfg
server_addr: xxx.vuln.cn:4443
trust_host_root_certs: false
tunnels:
    http:
        proto:
            http: 80
        subdomain: pi
    ssh:
        remote_port: 2222
        proto:
            tcp: 22

运行

./ngrok -config=ngrok.cfg start ssh

配置域名解析

如图即可,

注意,一定要解析一个前面不带星号的,因为tcp端口转发不需要前面的三级域名,所以要解析xxx.vuln.cn,如果不单独解析一个,那么会解析不了。

配置开机启动

打开 /etc/rc.local

在exit 0这句之前加入这句话:

(sleep 3; /root/ngrok/ngrok -config=/root/ngrok/ngrok.cfg start ssh) &

路径自行修改,注意全部用绝对路径