本来准备接着继续讲Nmap,但是考虑到Windows批处理这个基础知识点没讲,还是先讲这个好了;反正该来的总是要来,不妨把基础打牢了再看工具
不要怕,Windows批处理脚本的环境搭建非常简单
最简单的,可以用notepad
来写批处理文件
我比较推荐用notepad++
,看个人喜好
前面讲过,在Windows上用cmd.exe
执行批处理文件
你可以切换到它的全路径C:\Windows\System 32\cmd.exe
也可以在运行
窗口中输入名字查找
如果要运行写好的命令,首先打开cmd.exe
窗口,接着敲脚本文件的绝对路径,或者如之前已经把该脚本加到了环境变量就直接输入这个环境变量
比较而言,我们推荐后者:先C:
到C盘,接着md Application\bin
创建一个新文件夹,用来存放我们的脚本源码,最后(对于Win7、Win8)实用setx
命令添加一个环境变量
setx path "%path%;C:\Application\bin\"
在DOS模拟模式下,使用help
命令打印命令列表,help COMMAND
打印该命令的帮助文档,COMMAND /?
打印该命令的所有开关列表
当然,官方文档跑不掉:Microsoft Windows Command
在批处理脚本源文件中,一些符号有着特殊的意义
被修饰的行不显示命令本身
@命令
用来表示变量的引用(在批处理中,不区分大小写)
echo %path%
1. 单冒号:冒号后紧跟的是标签名,之后可以用该标签名调用这个标签行
2. 双冒号:相当于注释符号,这一行将被解释器丢弃
其它一些符号有的和Linux重复了,另有的用到时再讲
:label echo Hello world
:: This line will be discarded...
goto label
解释下,1. pause>nul
和pause
是不同的,它不输出提示信息,2. 在批处理脚本用于赋值的=
号两边没有空格(和bash一样)
惊叹号和百分号类似,用来括住变量
先介绍一个背景知识:批处理的延迟扩展
猜猜会打印多少:是你输入的值,还是1000?(答案:你输入的值)
解释:批处理文件被解释器逐行读取,到 set a=1000 & echo %a%
这一行时,先解释引用的变量,于是echo出来的a就是你输入的值了
要想让命令在在解释时感知到当前行的其他命令,使用setlocal enabledelayedexpansion
指令配合!
符号来消除误会
记忆技巧:set(设置)、local(局部的)、enable(启用)、delayed(延迟的)、expansion(扩展)
【 FOR %A IN (list) DO command [ parameters ] 】
A is a loop variable, which can be replaced by any character or word
list is a list of any elements, separated by either spaces, comma's or semicolons.
command can be any internal or external command, batch file or even - in OS/2 and NT - a list of commands
parameters contains the command line parameters for command.
In this example, command will be executed once for every element in list, using parameters if specified.
A special type of parameter (or even command) is %A, which will be substituted by each element from list consecutively.
在命令提示符和批处理文件下的循环体写法是不同的:命令提示符下循环变量写一个百分号,而批处理文件中的循环变量写写两个百分号
注意下,批处理的循环变量只能是单个字符的字母,如果是多个字符会报错!
【 IF [NOT] ERRORLEVEL number command 】
【 IF [NOT] string1==string2 command 】
【 IF [NOT] EXIST filename command 】
NOT Specifies that Windows NT should carry out the command only if the condition is false.
ERRORLEVEL number Specifies a true condition if the last program run returned an exit code equal to or greater than the number specified.
command Specifies the command to carry out if the condition is met.
string1==string2 Specifies a true condition if the specified text strings match.
EXIST filename Specifies a true condition if the specified filename exists.
补充知识:%errorlevel%
表示上一个命令的返回值,在0~255之间,成功返回0,失败返回1
下面就以errorlevel为例
批处理文件和DOS窗口有着千丝万缕的联系,要学好批处理就得同时学好DOS命令
英文参考资料
net
命令是微软提供的最重要的网络命令,包含了管理网络环境、服务、用户、登陆等Windows 98/NT/2000中大部分重要的管理功能;使用它可以轻松的管理本地或者远程计算机的网络环境,以及各种服务程序的运行和配置。或者进行用户管理和登陆管理等
win7、win8、win10的net命令语法是一样的
net use [..]
命令是后面要讲的IPC$攻击的基础,务必牢牢掌握(具体用法见后文IPC$攻击部分)
英文参考资料
这个命令估计没有人不知道吧,它是用来检查网络是否通畅或者网络连接速度的命令
Window Vista、Win7、Win8的语法是一样的
ping自己,用来检查是否可以把数据包发送出去,是否可以接受来自外面的数据包
还记得吗,Nmap有个选项就是利用了ping命令来侦测对方主机是否在线,如果ping不通可能是因为对方装有防火墙并且阻止了ICMP响应
英文参考资料
不要和下面讲的netstat弄混了,nbtstat(和netstat差一个字母),该命令使用TCP/IP上的NetBIOS显示协议统计和当前TCP/IP连接,使用这个命令你可以得到远程主机的NETBIOS信息,比如用户名、所属的工作组、网卡的MAC地址等
英文参考资料
下面讲解的是在Windows vista及其之后版本的语法,使用netstat命令查看开放主机的开放端口和连接信息情况
说明:在状态列,LISTENING为监听状态,表示侦听来自远方的TCP端口的连接请求,TIME_WAIT为等状态,ESTABLISHED的意思是建立连接。表示两台机器正在通信,CLOSE_WAIT意味着对方主动关闭连接或者网络异常导致连接中断闭
英文参考资料
实际上就是Windows版本的traceroute
命令
上面的输出结果和通信的两台主机的具体地理位置有关(今天可能网络有点不好,总之看上面111.38.2.68是中国移动的那个IP——知道了IP地址如果是Linux又可以用dig命令进一步发掘隐藏信息,这个自己玩玩!)
英文参考资料
telnet的英文意思就是“远程登录”,正如其名,telnet命令是用来远程登录的(废话!)
在讲解前,补充一个小知识点:@
符号的应用,你一定见过@echo off
(在批处理文件的文件开头),echo off
表示在此语句后所有运行的命令都不显示命令行本身,而echo off
本身作为命令还是会被显示出来,所以要在该命令前再加一个@
来隐藏这条命令,总的来讲,@echo off
就是不让显示命令本身
下面就让我们结合具体实例进行讲解
问题背景:系统蓝屏;开机按F8进入安全模式,选择Step by step confirmation后,给出提示“The folowing file is missing or corrupted:c:\windows\ifshlp.sys”
问题解决:
1. 重启,按F8进入安全模式,选择Command Prompt Only(DOS实模式)
2. cd \windows
3. undelete
补充:在命令行下切换到和打开回收站的方法
切换到回收站:cd \$Recycle.Bin
,列出文件:dir /A /S
打开回收站:start shell: RecycleBinFolder
问题背景:你在某网站下载了最新的盗版电影准备看却发现,电影被分割成了好几部分,看起来好不方便
问题解决:使用copy /b
命令
copy /b show1.mpg+show2.mpg+show3.mpg show.mpg
上面的命令把show1.mpg、show2.mpg和show3.mpg合并成show.mpg文件
首先明确,电脑的密码分为BIOS密码和系统用户登陆密码两种,其中BIOS密码虽然可以用第三方软件清除,但是我们从本质上掌握更好
这里,我们在DOS下使用debug.exe
这个内置程序
再次说明:这个方法可能对于最新的笔记本无效——始终记住,技术不断更新!但是多掌握一门技能总是没错的
最讨厌旁人没事乱动自己的电脑又不想明讲,就用批处理吧!
@echo off
echo non-system disk or disk error
choice /c:#/n
效果:系统蓝屏,输入指定字符后恢复正常
说明:choice
命令可以提示用户输入一个选择项,根据用户输入的选择项再决定执行具体的过程
常用的选项是/c
,用来确定选择集(默认是Y/N),/n
则让选择集不可见
@echo off
:loop for %%i in 80 do echo _
goto loop
效果:雪花屏,在按下ctrl+break
后退出
说明:一个简单的for循环而已
互联网永远是黑客们的天堂,不为啥就因为它的互联性和匿名性,一台计算机(广义理解,单片机也是计算机,也可以联网那个网络也叫互联网)在联网后你就不是一人在玩耍,而是全球的在线用户陪你一起玩耍!
写得『非常』杂,大家将就下好么XD,关键是思想!
主要围绕着几个关键字展开:网络协议(network protocols)、数据包(network packet)、地址(address),其中地址包括IP地址、MAC地址等,它的功能是定位
(图片来自“网络”)
维基百科英文资料
OSI Standards documents
在介绍之前,先介绍个组织ISO(International System Organization),它发明了一个模型,叫OSI(Open System Interconnection,也有叫ISO参考模型即OSI/RM)——先把这两个名字搞清楚了再讲呗~
OSI模型把计算机通信协议划分为7层(如图)
自上而下前三层面向用户,第四层完成数据传输,最下面三层是媒体层;按照上面图片的标号,它们的中文名字分别是:1. 物理层、2, 数据链路层、3. 网络层、4. 传输层、5. 会话层、6. 表示层、7. 应用层
这些层这样工作:下面层向上面层传递服务,上面层接受来自下面层的服务
基于此,有五层TCP/IP协议——合并了面向用户的三层,即把应用层、表示层和会话层合并为一个应用层,四层TCP/IP协议还把数据链路层和物理层合并为一个网络接口层
(再次感谢图片来自网络)
物理层在比特等级(bit-level)上处理传输任务(传输比特流),并支持连接到物理介质的电气或机械接口进行同步通信,通俗的讲就是传输的数据是通过何种方式,以什么形态传输的
它处理几乎所有的物理连接,如无线传输,布线,布线标准和类型,连接器和类型,网络接口卡等;注意,物理层并不涉及实际的物理介质(如铜线、光纤)
数据链路层和物理层合作提供节点到节点的数据传送(node-to-node data transfer,即将数据从网络上的一个节点传送到下一个节点)
物理层的比特流必然会存在误差,而设置数据链路层目的就是为了在存在差错的物理层的基础上采用差错检测、差错控制和流量控制等方法,将有差错的物理线路改进为无差错的数据链路,向网络层提供高质量的数据传输服务
背景知识1:在信息技术中,分组(packet)是目前分组交换网络中传输的格式化数据块,是基本的信息传输单位;它和报文(message)不同
背景知识2:路由和路由器:把数据包从一个主机传送到另一个主机的过程称为“路由”,它通常由称为路由器的专用设备执行,数据包是所有现代计算机网络中信息传输的基本单元,并且越来越多地在其他通信网络中
背景知识3:路由表(Routing Information Base)是指路由器或者其他互联网网络设备上存储的一张路由信息表,该表中存有到达特定网络终端的路径,在某些情况下,还有一些与这些路径相关的度量
背景知识4:路由控制(Routing Control)机制由硬件和软件共同组成,它通过与互联网服务提供商(ISP)的连接来监控所有输出流量,并帮助选择有效传输数据的最佳路径
背景知识5:主机是具有IP地址但不能进行路由控制的设备 ,路由器是既有IP地址又能进行路由控制的设备,在互联网中主机和路由器统称为节点(node)
网络层提供将变长数据序列(分组)从一个节点传送到另一个“不同网络”中连接的另一个节点的功能和程序手段
网络层要讨论的问题是分组怎样从一个网络通过路由器转发到另一个网络
网络层中涉及众多的协议,其中包括最重要的协议,也是TCP/IP的核心协议——IP协议
传输层提供从源到目标主机传输可变长度数据序列的功能和程序手段,同时保持服务质量功能
传输层和网络层的区别:看这里,感谢形象的解释!
会话层控制计算机之间的对话(连接),建立在传输层之上,利用传输层提供的服务,使应用建立和维持会话,并能使会话获得同步;会话层使用校验点可使通信会话在通信失效时从校验点继续恢复通信;这种能力对于传送大的文件极为重要
会话层的作用总结起来就是负责主机之间的通信、会话的建立,建立和维护会话,并区分不同服务
表示层为在应用过程之间传送的信息提供表示方法的服务,它只关心信息发出的语法和语义
表示层负责数据的表示和加密
引用层也叫应用实体,它定义了应用数据的抽象语法,相当于层次程序设计语言定义的抽象数据类型
应用层协议定义了运行在不同端系统上的应用程序进程如何相互传递报文
跑在应用的协议列出来确实不少:著名的有DNS、FTP、SMTP、HTTP协议等
背景知识1:互联网协议蔟(Internet Protocol Suite)和TCP/IP协议蔟(TCP/IP Protocol Suite):这两个概念通常混为一谈,事实上前者包含后者,而因为后者太著名所有我们讲的IP协议蔟通常就是指TCP/IP协议蔟
背景知识2:数据报(datagrams)是通过网络传输的数据的基本单元,包含一个报头(header)和数据本身,其中报头描述了数据的目的地以及和其它数据之间的关系。数据报是完备的、独立的数据实体,该实体携带要从源计算机传递到目的计算机的信息,该信息不依赖以前在源计算机和目的计算机以及传输网络间交换;数据报和报文(message)是不同的,数据报跑在网络层,而报文跑在应用层
背景知识:IP分片(IP fragmentation)原理,指把数据报切分为更小的碎片;所产生的片段可以通过具有比原始分组大小更小的最大传输单元(MTU)的链路;片段由接收主机重新组装(如图)
IP的全称是Internet Protocol(互联网协议),是互联网协议簇中用于跨网络边界中继数据报的主要通信协议;其路由功能可以实现互联,并基本建立互联网
IP的任务是仅根据数据包标头中的IP地址将数据包从源主机传送到目标主机;IP定义封装要传递的数据的数据包结构,它还定义了用于标记具有源和目标信息的数据报的寻址方法
互联网协议负责寻址主机,将数据封装到数据报中(包括分段和重组),并通过一个或多个IP网络将数据报从源主机路由到目标主机;互联网协议定义数据包的格式并提供寻址系统
IP寻址需要为主机接口分配IP地址和相关参数,这些地址空间被划分为不同的子网(subnetworks):关于子网划分,详见下文!
最早的IP叫IPv4,截止2018年4月IPv6已经占到了所有IP地址的20%
背景知识1:专用网络(private network,也叫local network)——专用网络是使用专用IP地址空间的网络,IPv4和IPv6规范都定义了专用寻址范围,这些地址通常用于住宅,办公室和企业环境中的局域网(LAN),最初定义专用IP地址空间是为了延迟IPv4地址耗尽,私有网络地址不会分配给任何特定组织,任何人都可以在未经区域互联网注册管理机构批准下使用,但是从它们(专用网络)寻址的IP数据包不能通过公共互联网路由,最常用的专用IP如192.168.1.1
,记住一点:专用IP是写给路由器看的;
背景知识2:点分十进制(dotted-decimal notation)用于表示现行IP地址(IPv4),如图
背景知识3:路由器、NAT和公共网络地址——路由器是特殊的,因为它们有两个IP地址——为每个路由器的两个“接口”分配一个IP地址,第一个路由器接口称为WAN(广域网)接口;NAT全称是“Network Address Translation”,中文名为“网络地址转换(网路地址解读?)”(不是那个远控程序哈),指网络设备(通常是防火墙)将专用地址分配给专用网络内的计算机(或一组计算机)的过程,可说NAT是让LAN里面的小网络融入到大互联网的的过程,出于经济和安全目的,NAT的主要用途是限制组织或公司必须使用的公共IP地址的数量
一不注意,该写的都写在背景知识里面了……IP地址分为专用IP地址和公共IP地址
在我写这篇文章时,现在最流行的仍然是IPv4,但是IPv6是趋势
IPv4使用32位bit定义地址,而IPv6使用128位定义地址,一劳永逸
IPv4使用点分十进制表示,如172.16.254.1,而IPv6使用八段四位冒号分割十六进制表示,如2001:db8:0:1234:0:567:8:1
在线子网掩码计算器:Subnet Calculator(IPv4 Only)
IP地址实际上分为两部分:网络地址(network address)和主机地址(host address),子网掩码的作用就是将它们区分开来,如果需要额外的子网,子网划分还会将IP地址的主机部分划分为子网和主机地址
子网掩码(subnet mask)又叫网络掩码、地址掩码、子网络遮罩,它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码;子网掩码不能单独存在,它必须结合IP地址一起使用;子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分
它被称为子网掩码,因为它用于通过在网络掩码上执行按位AND操作来识别IP地址的网络地址;子网掩码是通过将网络位设置为全“1”并将主机位设置为全“0”来完成的;子网掩码是一个32位数字,用于屏蔽IP地址,并将IP地址分为网络地址和主机地址;在给定的网络中,两个主机地址被保留用于特殊目的,“0”地址被分配一个网络地址,“255”被分配给一个广播地址,并且它们不能被分配给主机
举个例子:IP地址84.42.58.11,它的二进制01010100 00101010 0011101000001011(A类IP地址),它的网络地址是84.0.0.0,它的主机地址是0.42.58.11(该例子参考Quora)
最通俗的算法:先把IP地址换算为二进制,然后数前面有多少个1,那前面这些都是网络位,剩下的就是主机位
TCP/IP协议(Transmission Control Protocol/Internet Protocol),中文名为『传输控制协议/因特网互联协议』,又名『网络通讯协议』,是互联网协议家族中最重要、最基础的协议,由网络层的IP协议和传输层的TCP协议组成,TCP协议补充了最最基础的IP协议,所以人们一般将它们合并起来称为TCP/IP协议
通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台联网设备规定一个地址
IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层—TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层
下面主要介绍TCP协议
TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端的通讯;TCP提供的是一种可靠的数据流服务,采用“带重传的肯定确认”技术来实现传输的可靠性;TCP还采用一种称为“滑动窗口”的方式进行流量控制,所谓窗口实际表示接收能力,用以限制发送方的发送速度
TCP在通过IP网络进行通信的主机上运行的应用程序之间提供可靠(reliable)、有序(ordered)和错误检查(error-checked)的八位字节流(字节)传送;诸如万维网(World Wide Web)、电子邮件(email)、远程管理(remote administration)和文件传输(file transfer)等主要互联网应用都依赖于TCP
参考链接1
参考链接2
TCP的建立连接需要三次握手,TCP的结束连接需要四次挥手
在讲解之前,让我们先看几个名词:1. seq:sequence(序列)、2. ack:acknowledge(确认)、3. syn:synchronize(同步)、4. fin:finally(结束)
TCP建立:三次握手(3-way handshake);首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了
TCP断开:四次挥手(4-way handshake);可以看成是两阶段的2-way handshake,第一阶段Client端发送FIN给Server端,Client端变成FIN_WAIT2状态,第二阶段Server端向Client端发送FIN,在Client端接收到后发送ACK给Server端并断开连接
背景知识1:分组交换原理(参考英文维基百科),分组交换是一种将通过数字网络传输的数据分组为由报头和有效载荷构成的分组的方法;网络硬件使用报头中的数据将数据包定向到应用软件提取并使用有效负载的目的地;分组交换是全球计算机网络中数据通信的主要基础
背景知识2:带宽(bandwidth)是给定路径上数据传输的最大速率;带宽可以表征为网络带宽(network bandwidth)、数据带宽(data bandwidth)、或数字带宽(digital bandwidth)
网络数据包(network packet)是由分组交换网络携带的格式化数据单元
一个数据包由控制信息(control information)和用户数据(user data)组成,用户数据也称为有效载荷(payload,理解为“part of the load that pays for transportation”)
控制信息提供用于传递有效载荷的数据,如源和目标网络地址、错误检测代码和排序信息;通常控制信息在数据包头部(headers)和尾部(trailers)中找到
Linux内核提供的名为netfilter的数据包过滤器框架,该框架使具有适当数量的网卡(接口)的Linux机器成为能够进行NAT的路由器;使用命令实用程序iptables
来创建用于修改和过滤数据包的复杂规则
NAT的三条规则:1. PREROUTING、2. OUTPUT、3. POSTROUTING
FILTER的三条规则:1. ACCEPT、2. DROP、3. REJECT(REJECT比DROP多返回一个ICMP错误信息包)
默认情况下-t
(type)参数是filter
,首先设置默认规则(ACCEPT、DROP、REJECT)
iptables -P OUPUT ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP
然后设置具体的规则:-j
后面跟的参数将优先于默认规则执行
使用-A
或-I
向后或向前添加规则
iptables -A INPUT --in-interface lo -j ACCEPT # 允许本地服务(如打印机)
iptables -A INPUT -p tcp --dport 8008 -j ACCEPT # 允许在8008端口的本地网络服务
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 允许SSH流量
chain中的规则按照自上而下进行解析
你去Google搜“what is IPC$ attack”,第一条就是
呵呵,既然这么流行,作为中国人不会IPC$攻击就说不过去了……
参考百度文库
参考英文文献
背景知识:1. IPC$、2. 空会话(null session)
“用过Windows 2000的人都知道,Windows 2000的默认安装允许任何用户通过空用户连接(IPC$)得到系统所有账号和共享列表,这本来是为了方便局域网用户共享资源和文件的,但是任何一个远程用户都可以利用这个空的连接得到你的用户列表”——摘自「百度百科」
IPC$(Inter-Process Communication Share)是共享命名管道资源,它是为了让进程间通信而开放的命名管道,可以通过验证用户名和密码获得相应的权限,在远程管理计算机和查看计算机的共享资源时使用
当用户没有使用用户名或者密码来与windows系统建立连接时就会出现空会话,这种类型的连接不能进行任何典型的windows共享,但是可以进行进程间通信(IPC)管理共享
IPC$和空会话行为存在于Windows 7、Windows Server 2008 R2、Windows Vista、Windows Server 2008、Windows XP和Windows Server 2003
IPC$共享链接本身不是漏洞,说漏洞的是$IPC服务引发的“空会话漏洞”,为了方便统一称为“IPC$漏洞”
这个网上教程有很多,如果看不懂多找几篇看看然后就懂了
1. 建立空连接
net use \\IP\ipc$ “” /user:”“
2. 建立非空连接
net use \\IP\ipc$ “密码” /user:”用户名”
3. 映射默认共享
net use z: \\IP\c$ “密码” /user:”用户名”:将对方的C盘映射为自己的Z盘
4. 删除一个IPC$连接
net use \\IP\IPC$ /del
5. 删除共享映射
net use c: /del:删除映射的C盘
net use * /del:删除全部映射,会有提示按y确认
6. 映射远程共享
net use z: \\IP\name:将共享名为name的共享资源映射到Z盘
7. 删除一个已经建立的IPC$连接
net use \\IP\IPC$ /del
模式是什么?模式就是套路!套路就表明它有章法可循!
这里网上有现成的教程,我直接给出链接好了:CMD下的IPC$入侵
另外这篇文章也会帮到你:连上IPC$后我能做什么
然后说几点我自己的心得:1. 首先建立$IPC连接不一定成功,前提是对方必须开启了否则免谈,2. 开启IPC$共享的CMD命令:net share IPC$,3. 查看本机开启的所有共享项目(看看是否包含了IPC$共享,如果没有就先开了再讲):net share,4. 在入侵前先检测对方是否开启了IPC$连接:net use \\IP\IPC$”” /user:”“(建立一个空连接,如果连接成功则说明对方电脑开放了远程IPC$)
最后,如何防范这个漏洞呢?我们可以修改注册表:CMD输入regedit
找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
,将RestrictAnonymous
的值改为1即可
或者在控制面板 -> 管理工具 -> 服务
找到Server,选择停止Server服务即可(这样的副作用是也禁用了LAN内的文件共享等服务)