http://p7.qhimg.com/t0146c6edc115893191.png

 


相信每一个渗透测试人员都明白那种美妙的感觉——netcat接收到反弹回来的反向shell,一行行让人满足的的详细的netcat信息被打印出来。

如果其他的渗透测试人员也像我一样,他们肯定也知道那种可怕的感觉——当他们的shell因为他们运行了一个错误的命令而被挂起时,本以为敲击“Ctrl-C”会搞定这个状况,但是没想到却断开了整个连接。

http://p9.qhimg.com/t01f48f87f0f14693ca.png

除了不正确的处理技术,这些“愚蠢”的shell还有其他的缺点:

1.一些命令,比如“su”和“ssh”需要适当的终端才能运行

2.标准错误信息(STDERR)经常不会被显示出来

3.不能正确使用文本编辑器如VIM

4.没有命令补全功能

5.“上”按键没有历史纪录功能

6.没有任务管理功能

7.等等。。。

长话短说,虽然这些shell相对来说很容易实施和捕获,但我更希望在一个完全互动的终端(TTY)中进行操作。

我发现了一些很好的资源,其中包括一些非常有用的技术和技巧,可以用来“升级”这些shell,希望在一篇文章中展示和分享。 在Pentest Monkey网站上, 根据Phineas Fisher发布的视频和他非法活动的writeups,我学会了这些技巧。

1.Pentest Monkey - Post Exploitation Without a TTY

2.Phineas Fisher Hacks Catalan Police Union Website

3.Phineas Fisher - Hackingteam Writeup

先简单说一下思路,在后面的截图和命令中,我会向一个有漏洞的Web服务器(受害者)注入命令,然后在我的kali虚拟机上接收反弹回来的shell。

1.受害者 IP: 10.0.3.7

2.我的KALI IP: 10.0.3.4


Generating reverse shell commands


相信每一个人都十分熟悉利用netcat获取反向shell的传统方法:

http://p9.qhimg.com/t01ccd1830994f82d98.png

接收:

http://p2.qhimg.com/t01eeb750a6436ce81f.png

但问题是并不是每一个服务器会安装netcat,而且也并不是每一个版本的netcat有“-e”参数。

Pentest Monkey上有一个很大的备忘单,列出了好些不同的方法,但是我最喜欢用的方法是利用Metasploit的msfvenom来为我生成一套命令。

在Metasploit 的"cmd/unix"目录下,有一些payload可以用来生成一套bind shell或者是反向shell。

http://p7.qhimg.com/t01093480424b35bc98.png

这些payload中的任何一个都可以配合msfvenom使用生成我们所需要的原始命令(需要指定LHOST, LPORT or RPORT)。比如,以下是一个netcat命令,其并不需要“-e”参数:

http://p0.qhimg.com/t01f640e0157757d1ee.png

还有一个Perl oneliner可以处理netcat没有被安装的情况:

http://p9.qhimg.com/t01d415ce3466753629.png

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


Method 1: Python pty 模块


在捕获了一个“愚蠢”的shell之后很长一段时间内,我使用的核心命令是用Python来加载pty模块。Pty模块可以为你生成一个伪终端,这可以欺骗一些命令如“su”,让他们以为他们是在合适的终端中执行的。要想升级“愚蠢”的shell,让他们具有如上的功能,只需简单的运行如下命令:

http://p3.qhimg.com/t01eb1776460befaca9.png

然后你就可照常运行“su”等命令,如下

http://p3.qhimg.com/t0135b402f020e0726a.png

不幸的是,该方法并不能解决上面提到的其他一些问题。组合键(Ctrl-C)仍将关闭netcat,也没有命令不全功能或历史记录功能。但这个快速但不完美的解决方法,帮助了我无数次。


Method 2: 使用 socat


Socat就像netcat一样是一个非常强大的网络瑞士军刀。通过TCP连接,我们可以用socat建立完整的TTY。如果在受害者服务器上安装了socat,你就可以用它来反弹一个反向shell。而你必须捕获与socat的连接,以便获得全部的功能。

下面的命令会生成一个完全交互的TTY反向shell:

On Kali (listen):

http://p5.qhimg.com/t01443fe9184e46a3eb.png

On Victim (launch):

http://p0.qhimg.com/t014933607907d90c2e.png

如果socat没有被安装,也不要叹气,这里还有一些独立的二进制文件,你可以到下面的GitHub链接中下载:

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

利用一个命令注入漏洞,就可以用一行命令在受害者服务器下载一个正确架构的socat到可写目录,然后改变它的权限(chmod),最后执行并反弹回一个反向shell:

http://p8.qhimg.com/t0180cc35643092bc90.png

而在kali上,你会捕获到一个完整交互的TTY会话,它支持命令补全功能,支持SIGINT/SIGSTP,vim,“上”键的历史纪录功能,等等。这是一个完整的终端,非常好。

http://p5.qhimg.com/t010567898015439cd0.png


Method 3: 魔法般的升级netcat


我在Phineas Fisher的黑客视频中看到他使用了这种技术,感觉就像是魔法一般。简单的说,只要设置一下kali终端内的一些stty参数,就可以将一个“愚蠢”的netcat shell升级为一个完整的TTY。

首先,遵循与方法1相同的技术,用Python加载PTY模块,一旦bash在PTY中运行了,用组合键“Ctrl-Z”将shell放到后台中去。

http://p5.qhimg.com/t01701c54e25dff16eb.png

当shell进到后台之后,现在来检查当前的终端和STTY信息,如此一来我们就可以强制已经连接上的shell去匹配它:

http://p9.qhimg.com/t01dad0ef0ba4a07de3.png

我们需要的信息是TERM类型("xterm-256color")和当前TTY的窗口大小("rows 38; columns 116")。

让shell继续保持在后台运行,现在将当前的STTY设置为原始类型,并告诉它回显输入字符,命令如下:

http://p8.qhimg.com/t014e4a2ae93ebe641b.png

由于使用了原始类型的STTY,所以这些输入/输出看上去都怪怪的,而且你也不会看到下一条命令,但是当您键入它们时,它们就会被处理。

接下来用“fg”将shell提到前台来,它会重新打开反向shell,但是内容的格式将会被去除掉。最后,用“reset”重置终端。

t018924fa7339cac203.png

注意:我并没有再次手动输入“nc”命令(上图中看起来像是我手动输入的)。我输入的是“fg”,只是它没有回显。现在“nc”命令是在前台的任务了。然后将“reset”命令输入到netcat shell中。

在用“reset”进行了重置后,shell看起来应该恢复了正常。最后一步是设置shell,终端类型,以及STTY的大小,使其匹配我们当前的kali窗口(信息来自上面收集的)。

http://p4.qhimg.com/t01653d69fb780eada7.png

最终的结果是得到一个完全交互的TTY,它包含了我们所期望的所有特性(命令补全功能、历史记录功能、任务控制等),所有这些都是在一个netcat连接上:

   http://p7.qhimg.com/t01a02f0746a855e98d.png

现在的可能性是无穷的。可以用Tmux来处理一个netcat shell吗 ? ?为什么不可以呢?:D

t019b8413c25450ef0e.png

命令备忘录:

用Python创建假终端

http://p1.qhimg.com/t01ec48002ed95d6663.png

使用socat

http://p0.qhimg.com/t018b7e3ad08304012d.png

使用STTY选项

http://p7.qhimg.com/t018d33f8da9fbd8bc7.png





本文由 安全客 翻译,作者:牧野之鹰

原文链接:https://blog.ropnop.com/upgrading-simple-shells-to-fully-interactive-ttys/