文档库 最新最全的文档下载
当前位置:文档库 › nmap源代码分析

nmap源代码分析

nmap源代码分析
nmap源代码分析

以下代码是对nmap_main()函数基本的分析。

其中以///开头是新添加的注释。而以类似于///的形式出现的注释用于标注一个比较大的功能代码段。

int nmap_main(int argc, char *argv[]) {

int i;

vector Targets;

time_t now;

struct hostent *target = NULL;

time_t timep;

char mytime[128];

addrset exclude_group;

#ifndef NOLUA

/* Only NSE scripts can add targets */

NewTargets *new_targets = NULL;///NewTargets为Singleton模式,产生单个实例

/* Pre-Scan and Post-Scan script results datastructure */

ScriptResults *script_scan_results = NULL;

#endif

char **host_exp_group;

int num_host_exp_groups;

HostGroupState *hstate = NULL;

unsigned int ideal_scan_group_sz = 0;

Target *currenths;

char *host_spec = NULL;

char myname[MAXHOSTNAMELEN + 1];

int sourceaddrwarning = 0; /* Have we warned them yet about unguessable source addresses? */

unsigned int targetno;

char hostname[MAXHOSTNAMELEN + 1] = "";

struct sockaddr_storage ss;

size_t sslen;

char **fakeargv = NULL;

now = time(NULL);

local_time = localtime(&now);

///设置错误log输出函数

if(o.debugging)

nbase_set_log(fatal,error);

else

nbase_set_log(fatal,NULL);

if (argc < 2 ) printusage(-1);

/* argv faking silliness */

fakeargv = (char **) safe_malloc(sizeof(char *) * (argc + 1));

for(i=0; i < argc; i++) {

fakeargv[i] = strdup(argv[i]);

}

fakeargv[argc] = NULL;

Targets.reserve(100);

#ifdef WIN32

win_pre_init();

#endif

///调用parse_options进行命令参数的解析

parse_options(argc, fakeargv);

///在Linux下设置终端为只读非阻塞方式,在Windows平台为空函数。

tty_init(); // Put the keyboard in raw mode

///将解析命令时需要延迟执行的操作在此处处理

apply_delayed_options();

#ifdef WIN32

///调用WSAStartup启动Winsock DLL,后续网络解析等需要用到。

win_init();

#endif

///如果用户使用了参数--iflist,那么会在此处打印网卡和路由表信息,然后退出。

///该选项对于显示指定发送网卡非常有帮助,可以提供基本的网络设备信息。 if (delayed_options.iflist) {

print_iflist();

exit(0);

}

///quashargv部分用于修改命令行参数,将程序名字更改为FAKE_ARGV(默认为“pine”),

///并将剩余的各个参数都清空。

///在命令中加入-q可实现quashargv功能。这最初是为了逃避ps等程序名称显示,便于隐蔽Nmap。

///不过在Windows系统上并无实效。

/* more fakeargv junk, BTW malloc'ing extra space in argv[0] doesn't work */

if (o.quashargv) {

size_t fakeargvlen = strlen(FAKE_ARGV), argvlen = strlen(argv[0]);

if (argvlen < fakeargvlen)

fatal("If you want me to fake your argv, you need to call the program with a longer name. Try the full pathname, or rename it fyodorssuperdedouperportscanner");

strncpy(argv[0], FAKE_ARGV, fakeargvlen);

memset(&argv[0][fakeargvlen], '\0', strlen(&argv[0][fakeargvlen]));

for(i=1; i < argc; i++)

memset(argv[i], '\0', strlen(argv[i]));

}

///如果使用FTP bounce scan的扫描方式,那么需要首先保证该FTP网站是可以访问到的。

///关于FTP bounce scan更多介绍,请参考:https://www.wendangku.net/doc/e513199087.html,/nmap_doc.html#bounce

/* If he wants to bounce off of an FTP site, that site better damn well be reachable! */

if (o.bouncescan) {

if (!inet_pton(AF_INET, ftp.server_name, &ftp.server)) {

if ((target = gethostbyname(ftp.server_name)))

memcpy(&ftp.server, target->h_addr_list[0], 4);

else {

fatal("Failed to resolve FTP bounce proxy hostname/IP: %s", ftp.server_name);

}

} else if (o.verbose) {

log_write(LOG_STDOUT, "Resolved FTP bounce attack proxy to %s (%s).\n",

ftp.server_name, inet_ntoa(ftp.server));

}

}

///

fflush(stdout);

fflush(stderr);

timep = time(NULL);

///准备将基本的扫描输出到文件与控制台中

/* Brief info in case they forget what was scanned */

Strncpy(mytime, ctime(&timep), sizeof(mytime));

chomp(mytime); ///去掉字符串末尾换行符

char *xslfname = o.XSLStyleSheet();///XML样式表

xml_start_document();

if (xslfname) {

xml_open_pi("xml-stylesheet");

xml_attribute("href", "%s", xslfname);

xml_attribute("type", "text/xsl");

xml_close_pi();

xml_newline();

}

std::string command;

if (argc > 0)

command += fakeargv[0];

for (i = 1; i < argc; i++) {

command += " ";

command += fakeargv[i];

}

xml_start_comment();

xml_write_escaped(" %s %s scan initiated %s as: %s ", NMAP_NAME, NMAP_VERSION, mytime, join_quoted(fakeargv, argc).c_str());

xml_end_comment();

xml_newline();

log_write(LOG_NORMAL|LOG_MACHINE, "# ");

log_write(LOG_NORMAL|LOG_MACHINE, "%s %s scan initiated %s as: ", NMAP_NAME, NMAP_VERSION, mytime);

log_write(LOG_NORMAL|LOG_MACHINE, "%s", command.c_str());

log_write(LOG_NORMAL|LOG_MACHINE, "\n");

xml_open_start_tag("nmaprun");

xml_attribute("scanner", "nmap");

xml_attribute("args", "%s", join_quoted(fakeargv, argc).c_str()); xml_attribute("start", "%lu", (unsigned long) timep);

xml_attribute("startstr", "%s", mytime);

xml_attribute("version", "%s", NMAP_VERSION);

xml_attribute("xmloutputversion", NMAP_XMLOUTPUTVERSION);

xml_close_start_tag();

xml_newline();

output_xml_scaninfo_records(&ports);

xml_open_start_tag("verbose");

xml_attribute("level", "%d", o.verbose);

xml_close_empty_tag();

xml_newline();

xml_open_start_tag("debugging");

xml_attribute("level", "%d", o.debugging);

xml_close_empty_tag();

xml_newline();

/* Before we randomize the ports scanned, lets output them to machine parseable output */

if (o.verbose) ///输出机器可以解析端口信息(grepable格式)

output_ports_to_machine_parseable_output(&ports);

#if defined(HAVE_SIGNAL) && defined(SIGPIPE)

///注册信号处理函数,这里只是直接忽略SIGPIPE信号。其具体实现为#define SIG_IGN (void (*)(int))1

signal(SIGPIPE, SIG_IGN); /* ignore SIGPIPE so our program doesn't crash because

of it, but we really shouldn't get an unexpected

SIGPIPE */

#endif

///检查配置的最大并发度是否在系统最大的套接字数量范围之内

if (o.max_parallelism && (i = max_sd()) && i < o.max_parallelism) { error("WARNING: Your specified max_parallel_sockets of %d, but your system says it might only give us %d. Trying anyway", o.max_parallelism, i);

}

if (o.debugging > 1) log_write(LOG_STDOUT, "The max # of sockets we are using is: %d\n", o.max_parallelism);

// At this point we should fully know our timing parameters

if (o.debugging) {

log_write(LOG_PLAIN, "--------------- Timing report ---------------\n");

log_write(LOG_PLAIN, " hostgroups: min %d, max %d\n", o.minHostGroupSz(), o.maxHostGroupSz());

log_write(LOG_PLAIN, " rtt-timeouts: init %d, min %d, max %d\n", o.initialRttTimeout(), o.minRttTimeout(), o.maxRttTimeout());

log_write(LOG_PLAIN, " max-scan-delay: TCP %d, UDP %d, SCTP %d\n", o.maxTCPScanDelay(), o.maxUDPScanDelay(), o.maxSCTPScanDelay());

log_write(LOG_PLAIN, " parallelism: min %d, max %d\n", o.min_parallelism, o.max_parallelism);

log_write(LOG_PLAIN, " max-retries: %d, host-timeout: %ld\n", o.getMaxRetransmissions(), o.host_timeout);

log_write(LOG_PLAIN, " min-rate: %g, max-rate: %g\n", o.min_packet_send_rate, o.max_packet_send_rate);

log_write(LOG_PLAIN,

"---------------------------------------------\n");

}

///

///

/* Before we randomize the ports scanned, we must initialize PortList class. */

if (o.ipprotscan)

PortList::initializePortMap(IPPROTO_IP, ports.prots, ports.prot_count);

if (o.TCPScan())

PortList::initializePortMap(IPPROTO_TCP, ports.tcp_ports, ports.tcp_count);

if (o.UDPScan())

PortList::initializePortMap(IPPROTO_UDP, ports.udp_ports, ports.udp_count);

if (o.SCTPScan())

PortList::initializePortMap(IPPROTO_SCTP, ports.sctp_ports, ports.sctp_count);

if (o.randomize_ports) {

if (ports.tcp_count) {

///将端口进行随机打乱操作

shortfry(ports.tcp_ports, ports.tcp_count);

// move a few more common ports closer to the beginning to speed scan

///将常见的端口移动到前面,以便最快地发现有效的端口

random_port_cheat(ports.tcp_ports, ports.tcp_count);

}

if (ports.udp_count)

shortfry(ports.udp_ports, ports.udp_count);

if (ports.sctp_count)

shortfry(ports.sctp_ports, ports.sctp_count);

if (ports.prot_count)

shortfry(ports.prots, ports.prot_count);

}

///exclude_group记录的是排除地址,如命令行nmap 192.168.1.1/24 --exclude 192.168.1.0-10

///扫描C类地址192.168.1.x,并排除其中192.168.1.0-192.168.1.10地址。 ///addrset_init()将初始化排除地址组的链表头指针为NULL。

addrset_init(&exclude_group);

/* lets load our exclude list */

if (o.excludefd != NULL) {///文件指定的排除地址

load_exclude_file(&exclude_group, o.excludefd);

fclose(o.excludefd);

}

if (o.exclude_spec != NULL) {///命令行直接指定的排除地址

load_exclude_string(&exclude_group, o.exclude_spec);

}

if (o.debugging > 3) ///若调试级别大于3,打印出排除地址信息

dumpExclude(&exclude_group);

///

///

#ifndef NOLUA

if (o.scriptupdatedb) {

o.max_ips_to_scan = o.numhosts_scanned; // disable warnings?

}

if (o.servicescan) ///当配置了版本扫描时,会默认启动版本扫描脚本,位于NSE中version类别中

o.scriptversion = 1;

if (o.scriptversion || o.script || o.scriptupdatedb)

open_nse(); ///开启NSE环境

/* Run the script pre-scanning phase */

if (o.script) {

new_targets = NewTargets::get(); ///分配实例或返回已有实例(Singleton模式)

script_scan_results = get_script_scan_results_obj();

script_scan(Targets, SCRIPT_PRE_SCAN);

printscriptresults(script_scan_results, SCRIPT_PRE_SCAN);

script_scan_results->clear();

}

#endif

///

///

/* Time to create a hostgroup state object filled with all the requested machines. The list is initially empty. It is refilled inside the loop whenever it is empty. */

///分配字符串数组,用以保存各个主机表达式字符串的地址

host_exp_group = (char **) safe_malloc(o.ping_group_sz * sizeof(char *));

num_host_exp_groups = 0;

hstate = new HostGroupState(o.ping_group_sz, o.randomize_hosts,

host_exp_group, num_host_exp_groups);

do {

///确定最佳的host group的大小,该大小取决于扫描方式与网络速度。 ideal_scan_group_sz = determineScanGroupSize(o.numhosts_scanned, &ports);

///

///以下的while()将依次进行主机发现,确定主机是否在线。

///若该主机在线加入该host group,用于后续的操作。当数量达到最佳大小时,退出循环。

while(Targets.size() < ideal_scan_group_sz) {

o.current_scantype = HOST_DISCOVERY; ///设置扫描状态:HOST_DICOVERY

currenths = nexthost(hstate, &exclude_group, &ports, o.pingtype); ///主机发现的核心函数

///如果当前主机发现无法找到有效主机,那么会做以下尝试:

///1)更换主机表达式(host expressions)

///例如:nmap 192.168.1.1/24 10.10.30.55-100,192.168.1.x不能再发现主机时候,切换为10.30.55-100

///2)将执行脚本扫描时发现的主机,加入主机表达式组host_exp_group ///3) 建立新的主机组状态,并做最后的主机发现尝试

if (!currenths) {

/* Try to refill with any remaining expressions */

/* First free the old ones */

for(i=0; i < num_host_exp_groups; i++)

free(host_exp_group[i]);

num_host_exp_groups = 0;

/* Now grab any new expressions */

while(num_host_exp_groups < o.ping_group_sz &&

(!o.max_ips_to_scan || o.max_ips_to_scan > o.numhosts_scanned + (int) Targets.size() + num_host_exp_groups) &&

(host_spec = grab_next_host_spec(o.inputfd, o.generate_random_ips, argc, fakeargv))) {

// For purposes of random scan

host_exp_group[num_host_exp_groups++] = strdup(host_spec); }

#ifndef NOLUA

/* Add the new NSE discovered targets to the scan queue */

if (o.script) {

if (new_targets != NULL) {

while (new_targets->get_queued() > 0 && num_host_exp_groups < o.ping_group_sz) {

std::string target_spec = new_targets->read();

if (target_spec.length())

host_exp_group[num_host_exp_groups++] = strdup(target_spec.c_str());

}

if (o.debugging > 3)

log_write(LOG_PLAIN,

"New targets in the scanned cache: %ld, pending ones: %ld.\n",

new_targets->get_scanned(),

new_targets->get_queued());

}

}

#endif

if (num_host_exp_groups == 0) ///当没有其他的主机表达式时,退出整个主机发现循环

break;

delete hstate;

hstate = new HostGroupState(o.ping_group_sz, o.randomize_hosts,host_exp_group,

num_host_exp_groups);

/* Try one last time -- with new expressions */

currenths = nexthost(hstate, &exclude_group, &ports, o.pingtype);

if (!currenths)

break;

}

if (currenths->flags & HOST_UP && !o.listscan)

o.numhosts_up++;

if ((o.noportscan && !o.traceroute

#ifndef NOLUA

&& !o.script

#endif

) || o.listscan) {

///当不进行端口扫描(-sn)并且没有指定traceroute和脚本的话,那么扫描就到此处就结束。

///或当进行列表扫描(-sL,只列举出主机IP,并不真正扫描)时,扫描也到此结束。

/* We're done with the hosts */

if (currenths->flags & HOST_UP || o.verbose) {

xml_start_tag("host");

write_host_header(currenths);

printmacinfo(currenths);

// if (currenths->flags & HOST_UP)

// log_write(LOG_PLAIN,"\n");

printtimes(currenths);

xml_end_tag();

xml_newline();

log_flush_all();

}

delete currenths;

o.numhosts_scanned++;

continue;

}

///若配置要伪造源IP地址(-S ip),将命令行中传入的地址写入当前主机源地址

if (o.spoofsource) {

o.SourceSockAddr(&ss, &sslen);

currenths->setSourceSockAddr(&ss, sslen);

}

///如果主机状态为HOST_DOWN,那么需要根据配置考虑是否输出其状态 ///输出条件:verbose级别大于0,并且没有指定openonly或已确定有开放端口。

///疑问:如果有open Ports,为什么此主机状态会是HOST_DOWN呢?

/* I used to check that !currenths->weird_responses, but in some rare cases, such IPs CAN be port successfully scanned and even connected to */

if (!(currenths->flags & HOST_UP)) {

if (o.verbose && (!o.openOnly() || currenths->ports.hasOpenPorts())) {

xml_start_tag("host");

write_host_header(currenths);

xml_end_tag();

xml_newline();

}

delete currenths;

o.numhosts_scanned++;

continue;

}

///如果是RawScan(即涉及到构建原始的packet的扫描方式,如SYN/FIN/ARP等等),

///需要设置套接字源IP地址

if (o.RawScan()) {

if (currenths->SourceSockAddr(NULL, NULL) != 0) {

if (o.SourceSockAddr(&ss, &sslen) == 0) {

///若全局变量o中已有源IP地址,直接赋值给当前目标机

currenths->setSourceSockAddr(&ss, sslen);

} else {

///否则,需要重新查询、解析主机来获取源地址

if (gethostname(myname, MAXHOSTNAMELEN) ||

resolve(myname, 0, 0, &ss, &sslen, o.af()) == 0)

fatal("Cannot get hostname! Try using -S or -e \n");

o.setSourceSockAddr(&ss, sslen);

currenths->setSourceSockAddr(&ss, sslen);

if (! sourceaddrwarning) {

error("WARNING: We could not determine for sure which interface to use, so we are guessing %s . If this is wrong, use -S .",

inet_socktop(&ss));

sourceaddrwarning = 1;

}

}

}

if (!currenths->deviceName())///网卡名字,在主机发现函数nexthost()中设置

fatal("Do not have appropriate device name for target");

///如果新发现的主机与该主机组类型不大相同,那么考虑将此主机放入新的主机组内。

///因为对主机分组是为了加快扫描速度,所以尽可能特征相似的主机组合在一起。

///流水线工作模式的扫描思想。

/* Hosts in a group need to be somewhat homogeneous. Put this host in

the next group if necessary. See target_needs_new_hostgroup for the

details of when we need to split. */

if (target_needs_new_hostgroup(Targets, currenths)) {

returnhost(hstate);

o.numhosts_up--;

break;

}

///设置IP诱骗时,将当前主机真实IP放入decoyturn位置。

///其他的诱骗IP地址在parse options时已经确定。

o.decoys[o.decoyturn] = currenths->v4source();

}

///将新发现的主机加入Targets向量

Targets.push_back(currenths);

}///一次分组的主机发现在此处结束,接下来执行端口扫描、服务侦测、OS 侦测、脚本扫描等。

///

if (Targets.size() == 0)///主机发现没有找到任何目标机时,退出主循环

break; /* Couldn't find any more targets */

// Set the variable for status printing

o.numhosts_scanning = Targets.size();

// Our source must be set in decoy list because nexthost() call can // change it (that issue really should be fixed when possible)

if (o.af() == AF_INET && o.RawScan())

o.decoys[o.decoyturn] = Targets[0]->v4source();

/* I now have the group for scanning in the Targets vector */

if (!o.noportscan) {

///

///针对用户指定的不同扫描方式,分别使用不同参数调用ultra_scan() ///ultra_scan()设计精巧,用统一的接口处理大多数的端口扫描

// Ultra_scan sets o.scantype for us so we don't have to worry if (o.synscan)

ultra_scan(Targets, &ports, SYN_SCAN);

if (o.ackscan)

ultra_scan(Targets, &ports, ACK_SCAN);

if (o.windowscan)

ultra_scan(Targets, &ports, WINDOW_SCAN);

if (o.finscan)

ultra_scan(Targets, &ports, FIN_SCAN);

if (o.xmasscan)

ultra_scan(Targets, &ports, XMAS_SCAN);

if (o.nullscan)

ultra_scan(Targets, &ports, NULL_SCAN);

if (o.maimonscan)

ultra_scan(Targets, &ports, MAIMON_SCAN);

if (o.udpscan)

ultra_scan(Targets, &ports, UDP_SCAN);

if (o.connectscan)

ultra_scan(Targets, &ports, CONNECT_SCAN);

if (o.sctpinitscan)

ultra_scan(Targets, &ports, SCTP_INIT_SCAN);

if (o.sctpcookieechoscan)

ultra_scan(Targets, &ports, SCTP_COOKIE_ECHO_SCAN);

if (o.ipprotscan)

ultra_scan(Targets, &ports, IPPROT_SCAN);

/* These lame functions can only handle one target at a time */ if (o.idlescan) {

for(targetno = 0; targetno < Targets.size(); targetno++) {

o.current_scantype = IDLE_SCAN;

keyWasPressed(); // Check if a status message should be printed

idle_scan(Targets[targetno], ports.tcp_ports,

ports.tcp_count, o.idleProxy, &ports);

}

}

if (o.bouncescan) {

for(targetno = 0; targetno < Targets.size(); targetno++) {

o.current_scantype = BOUNCE_SCAN;

keyWasPressed(); // Check if a status message should be printed

if (ftp.sd <= 0) ftp_anon_connect(&ftp);

if (ftp.sd > 0) bounce_scan(Targets[targetno], ports.tcp_ports,

ports.tcp_count, &ftp);

}

}

///

///

if (o.servicescan) {

o.current_scantype = SERVICE_SCAN;

service_scan(Targets);

}

if (o.servicescan) {

/* This scantype must be after any TCP or UDP scans since it * get's it's port scan list from the open port list of the current * host rather than port list the user specified.

*/

for(targetno = 0; targetno < Targets.size(); targetno++)

pos_scan(Targets[targetno], NULL, 0, RPC_SCAN);

}

///

}

///操作系统扫描

if (o.osscan){

OSScan os_engine;

os_engine.os_scan(Targets);

}

///若需要路径追踪,在此处调用traceroute获取路径

if (o.traceroute)

traceroute(Targets);

///脚本扫描

#ifndef NOLUA

if(o.script || o.scriptversion) {

script_scan(Targets, SCRIPT_SCAN);

}

#endif

///

for(targetno = 0; targetno < Targets.size(); targetno++) {

currenths = Targets[targetno];

/* Now I can do the output and such for each host */

if (currenths->timedOut(NULL)) {

xml_open_start_tag("host");

xml_attribute("starttime", "%lu", (unsigned long) currenths->StartTime());

xml_attribute("endtime", "%lu", (unsigned long) currenths->EndTime());

xml_close_start_tag();

write_host_header(currenths);

xml_end_tag(); /* host */

xml_newline();

log_write(LOG_PLAIN,"Skipping host %s due to host timeout\n",

currenths->NameIP(hostname, sizeof(hostname)));

log_write(LOG_MACHINE,"Host: %s (%s)\tStatus: Timeout",

currenths->targetipstr(), currenths->HostName());

} else {

/* --open means don't show any hosts without open ports. */ if (o.openOnly() && !currenths->ports.hasOpenPorts())

continue;

xml_open_start_tag("host");

xml_attribute("starttime", "%lu", (unsigned long) currenths->StartTime());

xml_attribute("endtime", "%lu", (unsigned long) currenths->EndTime());

xml_close_start_tag();

write_host_header(currenths);

printportoutput(currenths, ¤ths->ports);

printmacinfo(currenths);

printosscanoutput(currenths);

printserviceinfooutput(currenths);

#ifndef NOLUA

printhostscriptresults(currenths);

#endif

if (o.traceroute)

printtraceroute(currenths);

printtimes(currenths);

log_write(LOG_PLAIN|LOG_MACHINE,"\n");

xml_end_tag(); /* host */

xml_newline();

}

}

log_flush_all();

///

o.numhosts_scanned += Targets.size();

/* Free all of the Targets */

while(!Targets.empty()) {

currenths = Targets.back();

delete currenths;

Targets.pop_back();

}

o.numhosts_scanning = 0;

} while(!o.max_ips_to_scan || o.max_ips_to_scan > o.numhosts_scanned);

///当指定的扫描数量没有达到已经扫描数量,继续循环

///

///执行post-script,释放分配的资源

#ifndef NOLUA

if (o.script) {

script_scan(Targets, SCRIPT_POST_SCAN);

printscriptresults(script_scan_results, SCRIPT_POST_SCAN); script_scan_results->clear();

delete new_targets;

new_targets = NULL;

}

#endif

delete hstate;

addrset_free(&exclude_group);

hstate = NULL;

/* Free host expressions */

for(i=0; i < num_host_exp_groups; i++)

free(host_exp_group[i]);

num_host_exp_groups = 0;

free(host_exp_group);

if (o.inputfd != NULL)

fclose(o.inputfd);

printdatafilepaths();

printfinaloutput();

free_scan_lists(&ports);

eth_close_cached();

if (o.release_memory) {

/* Free fake argv */

for(i=0; i < argc; i++)

free(fakeargv[i]);

free(fakeargv);

nmap_free_mem();

}

return 0;

}

网络安全实验---NMAP扫描

一、实验目的和要求 了解信息搜集的一般步骤 学会熟练使用ping命令 学会利用Nmap等工具进行信息搜集 二、实验内容和原理 1.信息搜集的步骤 攻击者搜集目标信息一般采用七个基本的步骤: (1)找到初始信息,比如一个IP地址或者一个域名; (2)找到网络地址范围,或者子网掩码; (3)找到活动机器; (4)找到开放端口和入口点; (5)弄清操作系统; (6)弄清每个端口运行的是哪种服务; (7)画出网络结构图。 2.ping命令探测技巧 使用ping可以测试目标主机名称和IP地址,验证与远程主机的连通性,通过将ICMP 回显请求数据包发送到目标主机,并监听来自目标主机的回显应答数据包来验证与一台或多台远程主机的连通性,该命令只有在安装了TCP/IP协议后才可以使用。 ping命令格式:ping [选项] 目标主机。常用选项见表19-1-1。 表19-1-1 ping命令常用选项

生存时间(TTL):指定数据报被路由器丢弃之前允许通过的网段数量。TTL是由发送主机设置的,以防止数据包在网络中循环路由。转发IP数据包时,要求路由器至少将TTL 减小1。 TTL字段值可以帮助我们猜测操作系统类型,如表19-1-2所示。 表19-1-2 各操作系统ICMP回显应答TTL对照 3.Nmap介绍 nmap是一个网络探测和安全扫描程序,系统管理者和个人可以使用这个软件扫描大型的网络,获取哪台主机正在运行以及提供什么服务等信息。nmap支持很多扫描技术,例如:UDP、TCP connect()、TCP SYN(半开扫描)、ftp代理(bounce攻击)、反向标志、ICMP、FIN、ACK扫描、圣诞树(Xmas Tree)、SYN扫描和null扫描。nmap还提供了一些高级的特征,例如:通过TCP/IP协议栈特征探测操作系统类型,秘密扫描,动态延时和重传计算,并行扫描,通过并行ping扫描探测关闭的主机,诱饵扫描,避开端口过滤检测,直接RPC扫描(无须端口映射),碎片扫描,以及灵活的目标和端口设定。 nmap运行通常会得到被扫描主机端口的列表。nmap总会给出well known端口的服务名(如果可能)、端口号、状态和协议等信息。每个端口的状态有:open、filtered、unfiltered。open状态意味着目标主机能够在这个端口使用accept()系统调用接受连接。filtered状态表示:防火墙、包过滤和其它的网络安全软件掩盖了这个端口,禁止nmap探测其是否打开。unfiltered表示:这个端口关闭,并且没有防火墙/包过滤软件来隔离nmap的探测企图。通常情况下,端口的状态基本都是unfiltered状态,只有在大多数被扫描的端口处于filtered状态下,才会显示处于unfiltered状态的端口。 根据使用的功能选项,nmap也可以报告远程主机的下列特征:使用的操作系统、TCP

自己搜集总结的nmap常用命令及参数说明

nmap BT5(BackTrack--Information Gathering--Network Analysis--Network Scanners-nmap) -sP渗透内网之后判断当前网络那些主机在线 nmap-sP192.168.1/255 -vv现实详细的扫描过程 -sS使用SYN半开式扫描,这种扫描方式使得扫描结果更加正确(又称半开放,或 隐身扫描) nmap-vv-sS IP -O大写O代表OS判断主机操作系统 nmap-O IP 延时策略 -T(0-5)默认为3 0即Paranoid模式。为了避开IDS的检测使扫描速度极慢,nmap串所有的扫描, 每隔至少5分钟发送一个包 1即Sneaky模式。也差不多,只是数据包的发送间隔是15秒 2即Polite模式。不增加太大的网络负载,串行每个探测,并使每个探测间隔 0.4秒 3即Normal模式。nmap的默认选项,在不使网络过载或者主机/端口丢失的情况 下尽可能快速地扫描 4即Aggressive模式。设置5分钟的超时限制,对每台主机的扫描时间不超过5分 钟,并且对每次探测回应的等待时间不超过1.5秒。 5即lnsane模式。只适合快速的网络或者不在意丢失默些信息,每台主机的超时 限制为75秒,对每次探测只等待0.3秒。 nmap-sS-T1IP

-sV探测端口的服务类型/具体版本等信息 nmap-vv-sV IP -p端口号对某个端口的服务版本进行详细探测有助于升入的针对性攻击, 比如缓冲溢出攻击 nmap-vv-sV IP-p21 适用于内外网的探测,以内网操作为示例(外网参数同) 简单端口扫描:nmap-vv-sT(sS、sF、sU、sA)192.168.0.1-D127.0.0.1 (-D伪造的地址) OS检测:nmap-vv-sS-O192.168.0.1 RPC鉴别:nmap-sS-sR192.168.0.1Linux上的portmap就是一个简单的RPC服务,监听端口为111(默认) Ping扫射:nmap-sP172.16.15.0/24 1)获取远程主机的系统类型及开放端口 Get info about remote host ports and OS detection nmap-sS-P0-sV-O 这里的可以是单一IP,或主机名,或域名,或子网 -sS TCP SYN扫描(又称半开放,或隐身扫描) -P0允许你关闭ICMP pings. -sV打开系统版本检测 -O尝试识别远程操作系统

nmap扫描原理

Nmap是在免费软件基金会的GNU General Public License (GPL)下发布的,可从https://www.wendangku.net/doc/e513199087.html,/nmap站点上免费下载。下载格式可以是tgz格式的源码或RPM格式。目前较稳定的版本是2.12。带有图形终端,本文集中讨论Nmap命令的使用。Nmap 的语法相当简单。Nmap的不同选项和-s标志组成了不同的扫描类型,比如:一个Ping-scan命令就是"-sP"。在确定了目标主机和网络之后,即可进行扫描。如果以root 来运行Nmap,Nmap的功能会大大的增强,因为超级用户可以创建便于Nmap利用的定制数据包。 在目标机上,Nmap运行灵活。使用Nmap进行单机扫描或是整个网络的扫描很简单,只要将带有"/mask"的目标地址指定给Nmap即可。地址是"victim/24",则目标是c类网络,地址是"victim/16",则目标是B类网络。 另外,Nmap允许你使用各类指定的网络地址,比如192.168.7.*,是指192.168.7.0/24, 或192.168.7.1,4,8-12,对所选子网下的主机进行扫描。 Ping扫描(Ping Sweeping) 入侵者使用Nmap扫描整个网络寻找目标。通过使用" -sP"命令,进行ping扫描。缺省情况下,Nmap给每个扫描到的主机发送一个ICMP echo和一个TCP ACK, 主机对任何一种的响应都会被Nmap得到。 举例:扫描192.168.7.0网络: # nmap -sP 192.168.7.0/24 Starting nmap V. 2.12 by Fyodor (fyodor@https://www.wendangku.net/doc/e513199087.html,, https://www.wendangku.net/doc/e513199087.html,/nmap/) Host (192.168.7.11) appears to be up. Host (192.168.7.12) appears to be up. Host (192.168.7.76) appears to be up. Nmap run completed -- 256 IP addresses (3 hosts up) scanned in 1 second 如果不发送ICMP echo请求,但要检查系统的可用性,这种扫描可能得不到一些站点的响应。在这种情况下,一个TCP"ping"就可用于扫描目标网络。 一个TCP"ping"将发送一个ACK到目标网络上的每个主机。网络上的主机如果在线,则会返回一个TCP RST响应。使用带有ping扫描的TCP ping选项,也就是"PT"选项可以对网络上指定端口进行扫描(本文例子中指的缺省端口是80(http)号端口),它将可能通过目标边界路由器甚至是防火墙。注意,被探测的主机上的目标端口无须打开,关键取决于是否在网络上。 # nmap -sP -PT80 192.168.7.0/24 TCP probe port is 80 Starting nmap V. 2.12 by Fyodor (fyodor@https://www.wendangku.net/doc/e513199087.html,, https://www.wendangku.net/doc/e513199087.html,/nmap/)

实验报告-网络扫描与监听

信息安全实验报告 学号: 学生姓名: 班级:

实验一网络扫描与监听 一、实验目的 网络扫描是对整个目标网络或单台主机进行全面、快速、准确的获取信息的必要手段。通过网络扫描发现对方,获取对方的信息是进行网络攻防的前提。该实验使学生了解网络扫描的内容,通过主机漏洞扫描发现目标主机存在的漏洞,通过端口扫描发现目标主机的开放端口和服务,通过操作系统类型扫描判断目标主机的操作系统类型。 通过该实验,了解网络扫描的作用,掌握主机漏洞扫描、端口扫描、操作系统类型扫描软件的使用的方法,能够通过网络扫描发现对方的信息和是否存在漏洞。要求能够综合使用以上的方法来获取目标主机的信息。 而网络监听可以获知被监听用户的敏感信息。通过实验使学生了解网络监听的实现原理,掌握网络监听软件的使用方法,以及对网络中可能存在的嗅探结点进行判断的原理。掌握网络监听工具的安装、使用,能够发现监听数据中的有价值信息,了解网络中是否存在嗅探结点的判断方法及其使用。 二、实验要求 基本要求了解网络扫描的作用,掌握主机漏洞扫描、端口扫描、操作系统类型扫描软件的使用的方法,能够通过网络扫描发现对方的信息和是否存在漏洞。掌握网络监听工具的安装、使用,能够发现监听数据中的有价值信息等。提高要求能够对网络中可能存在的嗅探结点进行判断的方法及工具使用等。 三、实验步骤 1)扫描软件X-Scan 和Nmap 以及WinPcap 驱动安装包并安装。 2)打开X-Scan,如下图所示。 3)点击“设置”->“扫描参数”,弹出扫描参数设置对话框,在“指定IP 范围”输入被扫描的IP 地址或地址范围。在“全局设置”的“扫描模块”设置对话框中选择需要检测的模块。其他可以使用默认的设置,也可以根据实际需要进行选择。最后点击“确定”回到主界面。

nmap命令详解

nmap是一个网络探测和安全扫描程序,系统管理者和个人可以使用这个软件扫描大型的网络,获取那台主机正在运行以及提供什么服务等信息。nmap支持很多扫描技术,例如:UDP、TCP connect()、TCP SYN(半开扫描)、ftp代理(bounce攻击)、反向标志、ICMP、FIN、ACK扫描、圣诞树(Xmas Tree)、SYN扫描和null扫描。从扫描类型一节可以得到细节。nmap还提供了一些高级的特征,例如:通过TCP/IP协议栈特征探测操作系统类型,秘密扫描,动态延时和重传计算,并行扫描,通过并行ping扫描探测关闭的主机,诱饵扫描,避开端口过滤检测,直接RPC扫描(无须端口影射),碎片扫描,以及灵活的目标和端口设定. -------------------------------------------------------------------------------- 1.名称 nmap-网络探测和安全扫描工具 2.语法 nmap [Scan Type(s)] [Options] 3.描述 nmap是一个网络探测和安全扫描程序,系统管理者和个人可以使用这个软件扫描大型的网络,获取那台主机正在运行以及提供什么服务等信息。nmap支持很多扫描技术,例如:UDP、TCP connect()、TCP SYN(半开扫描)、ftp代理(bounce攻击)、反向标志、ICMP、FIN、ACK扫描、圣诞树(Xmas Tree)、SYN扫描和null扫描。从扫描类型一节可以得到细节。nmap还提供了一些高级的特征,例如:通过TCP/IP协议栈特征探测操作系统类型,秘密扫描,动态延时和重传计算,并行扫描,通过并行ping扫描探测关闭的主机,诱饵扫描,避开端口过滤检测,直接RPC扫描(无须端口影射),碎片扫描,以及灵活的目标和端口设定。 为了提高nmap在non-root状态下的性能,软件的设计者付出了很大的努力。很不幸,一些内核界面(例如raw socket)需要在root状态下使用。所以应该尽可能在root使用nmap。 nmap运行通常会得到被扫描主机端口的列表。nmap总会给出well known端口的服务名(如果可能)、端口号、状态和协议等信息。每个端口的状态有:open、filtered、unfiltered。open状态意味着目标主机能够在这个端口使用accept()系统调用接受连接。filtered状态表示:防火墙、包过滤和其它的网络安全软件掩盖了这个端口,禁止nmap探测其是否打开。unfiltered表示:这个端口关闭,并且没有防火墙/包过滤软件来隔离nmap的探测企图。通常情况下,端口的状态基本都是unfiltered状态,只有在大多数被扫描的端口处于filtered

Nmap扫描原理与用法

[+] Nmap扫描原理与用法 2012年6月16日 1Nmap介绍 Nmap基本命令和典型用法 ?全面进攻性扫描(包括各种主机发现、端口扫描、版本扫描、OS扫描及默认脚本扫描): nmap -A -v targetip ?Ping扫描: nmap -sn -v targetip ?快速端口扫描: nmap -F -v targetip ?版本扫描: nmap -sV -v targetip ?操作系统扫描: nmap -O -v targetip 2

Nmap扫描原理与用法PDF:下载地址 Nmap是一款开源免费的网络发现(Network Discovery)和安全审计(Security Auditing)工具。软件名字Nmap是Network Mapper的简称。Nmap最初是由Fyodor在1997年开始创建的。随后在开源社区众多的志愿者参与下,该工具逐渐成为最为流行安全必备工具之一。最新版的Nmap6.0在2012年5月21日发布,详情请参见:https://www.wendangku.net/doc/e513199087.html,。 一般情况下,Nmap用于列举网络主机清单、管理服务升级调度、监控主机或服务运行状况。Nmap 可以检测目标机是否在线、端口开放情况、侦测运行的服务类型及版本信息、侦测操作系统与设备类型等信息。 Nmap的优点: 1. 灵活。支持数十种不同的扫描方式,支持多种目标对象的扫描。 2. 强大。Nmap可以用于扫描互联网上大规模的计算机。 3. 可移植。支持主流操作系统:Windows/Linux/Unix/MacOS等等;源码开放,方便移植。 4. 简单。提供默认的操作能覆盖大部分功能,基本端口扫描nmap targetip,全面的扫描nmap –A targetip。 5. 自由。Nmap作为开源软件,在GPL License的范围内可以自由的使用。 6. 文档丰富。Nmap官网提供了详细的文档描述。Nmap作者及其他安全专家编写了多部Nmap 参考书籍。 7. 社区支持。Nmap背后有强大的社区团队支持。 8. 赞誉有加。获得很多的奖励,并在很多影视作品中出现(如黑客帝国2、Die Hard4等)。 9. 流行。目前Nmap已经被成千上万的安全专家列为必备的工具之一。 1.1 Zenmap

端口扫描工具nmap使用实验

我们可以使用ping扫描的方法(-sP),与fping的工作方式比较相似,它发送icmp回送请求到指定范围的ip地址并等待响应。现在很多主机在扫描的时候都做了处理,阻塞icmp 请求,这种情况下。nmap将尝试与主机的端口80进行连接,如果可以接收到响应(可以是

syn/ack,也可以是rst),那么证明主机正在运行,反之,则无法判断主机是否开机或者是否在网络上互连。 扫描tcp端口 这里-sR是怎样在打开的端口上利用RPC命令来判断它们是否运行了RPC服务。 nmap可以在进行端口扫描的tcp报文来做一些秘密的事情。首先,要有一个SYN扫描(-sS),它只做建立TCP连接的前面一些工作,只发送一个设置SYN标志的TCP报文,一个RESET报文,那么nmap假设这个端口是关闭的,那么就不做任何事情了。如果接收到一个响应,它并不象正常的连接一样对这个报文进行确认,而是发送一个RET报文,TCP的三次握手还没有完成,许多服务将不会记录这次连接。 有的时候,nmap会告诉我们端口被过滤,这意味着有防火墙或端口过滤器干扰了nmap,使其不能准确的判断端口是打开还是关闭的,有的防火墙只能过滤掉进入的连接。 扫描协议 如果试图访问另一端无程序使用的UDP端口,主机将发回一个icmp“端口不可达”的提示消息,IP协议也是一样。每个传输层的IP协议都有一个相关联的编号,使用最多的是ICMP(1)、TCP(6)和UDP(17)。所有的IP报文都有一个“协议”域用于指出其中的传输层报文头所使用的协议。如果我们发送一个没有传输层报文头的原始IP报文并把其协议域编号为130[该编号是指类似IPSEC协议的被称为安全报文外壳或SPS协议],就可以判断这个协议是否在主机上实现了。如果我们得到的是ICMP协议不可达的消息,意味着该协议没有被实现,否则就是已经实现了,用法为-sO. 隐蔽扫描行为 nmap给出了几个不同的扫描选项,其中一些可以配套着隐藏扫描行为,使得不被系统日志、防火墙和IDS检测到。提供了一些随机的和欺骗的特性。具体例子如下: FTP反弹,在设计上,FTP自身存在一个很大的漏洞,当使用FTP客户机连接到FTP 服务器时,你的客户机在TCP端口21上与FTP服务器对话,这个TCP连接称为控制连接。FTP服务器现在需要另一条与客户机连接,该连接称为数据连接,在这条连接上将传送实际的文件数据,客户机将开始监听另一个TCP端口上从服务器发挥的数据连接,接下来执行一个PORT命令到服务器,告诉它建立一条数据连接到客户机的IP地址和一个新打开的端口,这种操作方法称为主动传输。许多客户机使用网络地址转换或通过防火墙与外界连接,所以主动传输FTP就不能正常工作,因为由服务器建立的客户机的连接通常不允许通过。 被动传输是大多数FTP客户机和服务器所使用的方法,因为客户机既建立控制连接又建立数据连接,这样可以通过防火墙或NAT了。

实验3综合扫描及攻击工具的使用

实验3 综合扫描及攻击工具的使用 1 实验目的 1、通过使用综合扫描工具,扫描系统的漏洞并给出安全性评估报告,加深对系统漏洞的理解。 2、通过使用攻击工具了解远程攻击的方法,理解远程攻击的步骤和手段。 2 实验环境 VMware中预装Windows XP/7/2003/2008R2的计算机,X-Scan,Nmap,Winshell和NC等工具。 3 实验原理或背景知识 3.1 扫描工具的工作原理 综合扫描工具是一种自动检测系统和网络安全弱点的程序。其工作原理是,首先获得主机系统在网络服务、版本信息、Web应用等方面的相关信息,然后采用模拟攻击的方法,对目标主机系统进行攻击性的安全漏洞扫描,如测试弱口令等,如果模拟攻击成功,则视为漏洞存在。此外,也可以根据系统事先定义的系统安全漏洞库,对系统可能存在的、已知的安全漏洞逐项进行扫描和检查,按照规则匹配的原则将扫描结果与安全漏洞库进行对比,如满足匹配条件,则视为漏洞存在。 3.2 X-Scan简介 1、版本介绍 X-Scan是一个完全免费漏洞扫描软件,由“安全焦点”开发。对于黑客们来讲,X-Scan 是一款非常优秀的扫描器,现在的版本为X-Scan v3.3。从3.0及后续版本X-Scan提供了简单的插件开发包,便于有编程基础的朋友自己编写或将其他调试通过的代码修改为X-Scan插件。 2、X-Scan的使用 运行解压文件夹下的xscan_gui,即进入X-Scan,首先可以通过“普通信息”查看X-Scan 的使用,如图1所示。

上面是非常简洁的GUI界面。菜单栏如图2所示: 图2 菜单栏 我们点击第一个按钮,在弹出的“扫描参数”中,有如下几个参数可选: (1)检测范围:该模块指定您要扫描的对象,本地服务器还是网络中的计算机。默认 是localhost,这意味着你扫描的是本地计算机。范围也可以是1个IP段,方式如下: 223.221.21.0-223.221.21.100 这就说明你扫描的范围是在这两个IP范围内所有的计算机。 (2)全局设置 该功能模块包括以下4种功能子模块:扫描模块、并发扫描、扫描报告以及其他设置。 扫描模块:该列表包含了你所要扫描的项目、开放服务、NT-SERVER弱口令、NETBIOS 信息、SNMP信息等等的20个选项。 并发扫描:该模块限制了并发扫描的主机数量以及并发线程数量。 扫描报告:该功能模块是在您完成您的扫描后,X-Scan将以什么样的形式反馈扫描报 告。有3种文件参数:HTML,XML,TXT。默认的为localhost_report.HTML。 其他设置:该功能可以帮助您处理一些扫描过程中的问题,包括跳过没有响应主机,无 条件扫描等等。 (3)插件设置 该项目包括了端口相关设置,SNMP相关设置,NETBIOS相关设置,漏洞检测脚本设置, CGI相关设置,字典文件设置这6项设置。 端口相关设置:该模块将根据您的要求设置扫描的端口以及扫描方式。默认的端口扫描 参数为:7,9,13,19,21,22,23,25,53,79,80,110,111,119,135,139,143,

nmap 使用介绍

nmap 使用介绍 nmap是目前为止最广为使用的国外端口扫描工具之一。我们可以从 https://www.wendangku.net/doc/e513199087.html,/进行下载,可以很容易的安装到Windows和unix操作系统中,包括mac os x(通过configure、make 、make install等命令)也可以直接从http: //https://www.wendangku.net/doc/e513199087.html,/下载windows二进制(包括所需要的winpcap)也可以从http: //https://www.wendangku.net/doc/e513199087.html,/获得nmap的图形windows。 扫描主机

我们可以使用ping扫描的方法(-sP),与fping的工作方式比较相似,它发送icmp回送请求到指定范围的ip地址并等待响应。现在很多主机在扫描的时候都做了处理,阻塞icmp请求,这种情况下。nmap将尝试与主机的端口80进行连接,如果可以接收到响应(可以是 syn/ack,也可以是rst),那么证明主机正在运行,反之,则无法判断主机是否开机或者是否在网络上互连。 扫描tcp端口 这里-sR是怎样在打开的端口上利用RPC命令来判断它们是否运行了RPC服务。 nmap可以在进行端口扫描的tcp报文来做一些秘密的事情。首先,要有一个SYN扫描(-sS),它只做建立TCP连接的前面一些工作,只发送一个设置SYN标志的TCP报文,一个RESET报文,那么nmap假设这个端口是关闭的,那么就不做任何事情了。如果接收到一个响应,它并不象正常的连接一样对这个报文进行确认,而是发送一个RET报文,TCP的三次握手还没有完成,许多服务将不会记录这次连接。 有的时候,nmap会告诉我们端口被过滤,这意味着有防火墙或端口过滤器干扰了nmap,使其不能准确的判断端口是打开还是关闭的,有的防火墙只能过滤掉进入的连接。 扫描协议 如果试图访问另一端无程序使用的UDP端口,主机将发回一个icmp“端口不可达”的提示消息,IP协议也是一样。每个传输层的IP协议都有一个相关联的编号,使用最多的是ICMP(1)、TCP(6)和UDP(17)。所有的IP报文都有一个“协议”域用于指出其中的传输层报文头所使用的协议。如果我们发送一个没有传输层报文头的原始IP报文并把其协议域编号为130[该编号是指类似IPSEC协议的被称为安全报文外壳或SPS协议],就可以判断这个协议是否在主机上实现了。如果我们得到的是ICMP协议不可达的消息,意味着该协议没有被实现,否则就是已经实现了,用法为-sO. 隐蔽扫描行为 nmap给出了几个不同的扫描选项,其中一些可以配套着隐藏扫描行为,使得不被系统日志、防火墙和IDS检测到。提供了一些随机的和欺骗的特性。具体例子如下: FTP反弹,在设计上,FTP自身存在一个很大的漏洞,当使用FTP客户机连接到FTP服务器时,你的客户机在TCP端口21上与FTP服务器对话,这个TCP连接称为控制连接。FTP服务器现在需要另一条与客户机连接,该连接称为数据连接,在这条连接上将传送实际的文件数据,

命令大全

Liunx 常用命令 1.ifconfig 用于配置和显示Linux内核中网络接口的网络参数 2.type 用来显示指定命令的类型,判断给出的指令是内部 令还是外部指令 3.man Linux下的帮助指令,通过man指令可以查看Linux 中的指令帮助、配置文件帮助和编程帮助等信息 4.help 用于显示shell 内部命令的帮助信息 5.ls 列表显示文件及目录 6.du 查看文件或目录所占磁盘空间大小 7.touch 创建新文件,修文件时间戳 8.stat 用于显示文件的状态信息 9.mkdir 创建新目录 10.cp 复制文件或目录 11.rm 删除文件或目录 12.mv 移动文件或目录,同一目录下重命名 13.which 查看命令所在位置 14.find 精细查找文件所在位置 15.hostname 用于显示和设置系统的主机名称 16.cat 查看文件中的内容 17.tac 倒序查看文件内容 18.nl 查看文件内容=cat –n(空行不标号)

19.more 分页查看文件内容 20.less 与more 类似,比他功能更多 21.head 查看文件开头内容(默认显示10 行) 22.tail 查看文件结尾内容(默认显示10 行) 23.wc 查看文件中单词数 24.grep 过滤文件中的内容 25.egrep 精细过滤 26.gzip 压缩,格式为.gz 27.gunzip 解压缩 28.bzip2 压缩,格式为.bz2 29.bunzip2 解压缩 30.tar 制作归档、释放归档文件 31.vi 进入vi 编辑器 32.mount 用于加载文件系统到指定的加载点 33.umount 卸载已经加载的文件系统 34.md5sum 采用MD5 报文摘要算法(128 位)计算和检查文件的校验和 35.rpm RPM 软件包的管理工具

nmap常用命令

十条常用nmap命令行格式 1)获取远程主机的系统类型及开放端口 Get info about remote host ports and OS detection nmap -sS -P0 -sV -O 这里的 < target > 可以是单一 IP, 或主机名,或域名,或子网 -sS TCP SYN 扫描 (又称半开放,或隐身扫描) -P0 允许你关闭 ICMP pings. -sV 打开系统版本检测 -O 尝试识别远程操作系统 -sS TCP SYN scanning (also known as half-open, or stealth scanning) -P0 option allows you to switch off ICMP pings. -sV option enables version detection -O flag attempt to identify the remote operating system Other option: -A 同时启用操作系统指纹识别和版本检测 -A option enables both OS fingerprinting and version detection -v use -v twice for more verbosity. nmap -sS -P0 -A -v < target > 2)列出开放了指定端口的主机列表 Get list of servers with a specific port open nmap -sT -p 80 -oG – 192.168.1.* | grep open Change the -p argument for the port numb er. See “man nmap” for different ways to specify address ranges. 3)在网络寻找所有在线主机 4) Find all active IP addresses in a network nmap -sP 192.168.0.* 或者也可用以下命令: nmap -sP 192.168.0.0/24 指定 subnet 4)Ping 指定范围内的 IP 地址 Ping a range of IP addresses nmap -sP 192.168.1.100-254 nmap accepts a wide variety of addressing notation, multiple targets/ranges, etc. 5)在某段子网上查找未占用的 IP Find unused IPs on a given subnet nmap -T4 -sP 192.168.2.0/24 && egrep "00:00:00:00:00:00" /proc/net/arp

图解NMAP用法

《Network Security Technology》 Lecture Code: 011184 Experiment Guideline Experiment Title:使用NMAP进行网络扫描 KeyWords:NMAP,Scan,Vulnerability Lecturer:Dong Wang Time:Week 01 Location:Training Building 401 Teaching Audience:09Net1&2 Aug29, 2011

User Guidance 1.该配置文档系《网络安全技术》实训课所属内容。 2.在试验开始前,请参看‘Self-checking list for VM Environment’,逐 一检查自己电脑(虚拟机)配置,制作还原快照。 3.学生不应该以抓图为唯一目的使用该文档,对文档所涉及到的各相 关操作和问题需逐一思考解答并举一反三。 4.实验结果的抓图应当在没有文档和外界帮助下独立完成。 5.如学生不能在本节课上规定时间内完成文档介绍的配置任务时应当 在课后尽快补交试验报告。 6.该文档的最终解释权归授课教师王东所有,如有疑问请在课上当面 询问或课后与任课老师联络释疑。

Self-checking list for VM Environment 1.VM_2k3-1:安装1块网卡:NAT;VM_XP:安装1块网卡NAT; 2.开机运行VM_2K3-1 & VM_XP,2台机的应当位于同一网段且能够相 互Ping通; 3.将2k3-1(2)计算机命名为‘学号_姓名缩写_2K3-1(2)’,将XP命名为 ‘学号_姓名缩写_XP’,重命名之后重启。 4.确保已用管理员账户登录2k3-1和XP并具有管理员权限。 5.确保VMware Tools和Backinfo插件已正确安装。 6.用虚拟机的snapshot拍快照,制作还原点。 注:以上检查列表中逐条只是试验前的预检查,试验中的具体设置应当根据情况具体对待。

FTP常用命令

1.登陆命令: $ftp 服务器命或服务器ip地址 username:用户名 password:密码 ftp> 2.目录操命令: 显示目录下的文件: ftp>ls 显示服务器上的目录: ftp>ls H* 查看当前目录: ftp>cd(或pwd) 进入上一级目录 ftp>cd .. 更改本地机上的当前目录 ftp>lcd /usr/loca //把当前目录改成/usr/loca 进入子目录: ftp>cd 子目录名 3.文件传输命令: 下载命令: ftp>get 诗经·氓.rtf 下载多个文件: ftp>mget 诗经·氓.rtf hello.rtp 郭鹏翔.jpg **注:mget命令允许用通配符考贝多个文件。mget命令会提示用户输入待拷贝的每个文件。如果回答y,那么文件拷贝到本地机上的当前目录下。 上传命令: ftp>put hello.rtf //上传hello.rtf文件到远端的ftp服务器上。 上传多个文件: ftp>mput 诗经·氓.rtf hello.rtf pr命令.rtf **注意:mput和mget命令要注意两个问题: (1)、不能对目标文件指定命字,在命令行上所有的文件都视做源文件 (2)、mput,mget两个命令不能对目录进行上传下载,只能对文件 4.设置文件的传输方式: 二进制传输: ftp>binary //把传输模式转换一下 ftp>put putty.exe ascII传输: ftp>ascii //把传输模式转换成ascII模式 ftp>put hello.txe **注:文件传送有两种方式,即ASCII码和二进制码。ASCII方式传送略快些,但要求被传送文件必须是ASCII码文本文件。二进制码方式可以传送文本和非文本,因此,对所有文件传送都可以用二进制方式。输入命令ascii,设置为ASCII方式。输入命令binary为二进制方式。 5.退出命令:ftp>quit

Nmap实验报告

网络扫描软件Nmap的应用 在网络攻击时,攻击者往往会使用网络和端口扫描软件对目标主机进行扫描,发现漏洞,为后续攻击做准备。本实验使用网络扫描软件Nmap对北邮官网https://www.wendangku.net/doc/e513199087.html,(IP地址:10.3.9.254)进行多类型的主机和端口扫描并进行分析。 1.隐藏扫描(Stealth Scanning) -sS为TCP同步扫描,原理是源主机发送一个TCP同步包(SYN),然后等待目的主机的回应。如果对方返回SYN|ACK包,就表示该目标端口打开。Wireshark抓包可以看出 在扫描过程中,源主机(10.8.70.224)向目标主机(10.3.9.254)最可能打开的1000个端口发送了TCP同步包,其中只有80端口和3306端口返回了SYN|ACK包,说明目标主机开放了这两个端口。从Nmap扫描结果可以看出80端口提供的是http服务,3306提供的是mysql服务。

2.端口扫描(port scanning) -sT扫描是调用系统函数connect()用来打开一个链接,所以耗时要比-sS要多。RTTVAR(往返延时变量)很大,应该网络拥塞引起的。从wireshark抓包看出 源主机与目的主机之间建立了完全的TCP链接,探测到端口开放后立即发送RST 断开链接。

口不可到达的ICMP消息,端口就是关闭的。如wireshark抓包所示 源主机向目标机的1031端口发送了一个0字节的UDP包。 端口1031收到了ICMP消息,说明端口是关闭的。 包,而是内容为ntp的总长为224bit的UDP包。

对源主机所在网段(10.8.64.0/19)的主机进行Ping扫描。在局域网内,Nmap是通过发送ARP包来询问IP地址上的主机是否活动的,如果收到ARP 回复包,那么说明该主机在线。如wireshark抓包所示

Nmap实验报告

本文档如对你有帮助,请帮忙下载支持! 网络扫描软件Nmap的应用 在网络攻击时,攻击者往往会使用网络和端口扫描软件对目标主机进行扫描,发现漏洞,为后续攻击做准备。本实验使用网络扫描软件Nmap对北邮官网1.隐藏扫描(Stealth Scanning) -sS为TCP同步扫描,原理是源主机发送一个TCP同步包(SYN),然后等待目的主机的回应。如果对方返回SYN|ACK包,就表示该目标端口打开。Wireshark抓包可以看出在扫描过程中,源主机(10.8.70.224)向目标主机(10.3.9.254)最可能打开的1000个端口发送了TCP同步包,其中只有80端口和3306端口返回了SYN|ACK包,说明目标主机开放了这两个端口。从Nmap扫描结果可以看出80端口提供的是http服务,3306提供的是mysql服务。 2.端口扫描(port scanning) -sT扫描是调用系统函数connect()用来打开一个链接,所以耗时要比-sS要多。RTTVAR(往返延时变量)很大,应该网络拥塞引起的。从wireshark抓包看出 源主机与目的主机之间建立了完全的TCP链接,探测到端口开放后立即发送RST 断开链接。 3.UDP扫描(UDP Scanning) UDP扫描是向目标主机的每个端口发送一个0字节的UDP包,如果收到端口不可到达的ICMP消息,端口就是关闭的。如wireshark抓包所示 源主机向目标机的1031端口发送了一个0字节的UDP包。 端口1031收到了ICMP消息,说明端口是关闭的。 端口123开启的是ntp服务。值得注意的是,此时发送的并不是0字节的UDP 包,而是内容为ntp的总长为224bit的UDP包。 4.Ping扫描(Ping Sweeping) 对源主机所在网段(,Nmap是通过发送ARP包来询问IP地址上的主机是否活动的,如果收到ARP回复包,那么说明该主机在线。如wireshark抓包所示 源主机广播所扫描网段的ARP请求,没有回复的主机均视为没有在线。 ,说明 、 5.TCP ACK扫描 TCP ACK扫描是向目标机的端口发送ACK包,如果返回一个RST包,则这个端口就视为unfiltered状态。如wireshark抓包所示 如90端口收到了RET包,说明这个端口处于unfiltered状态。 6.操作系统类型扫描 从扫描结果可以得到目标主机的详细信息。目标主机的操作系统为AVM FRITZ!Box WLAN7240WAP。 7.Traceroute路由跟踪扫描 使用-traceroute可以得到本机到目标主机之间的拓扑结构和路由信息。从Nmap结果可以看出,本地主机到10.3.9.254一共要经过4跳才能到达。拓扑图如下 再对校内的图书馆,教务处,论坛进行扫描后可以得到学校的网络拓扑图 对百度进行扫描后得到校园网到外网的拓扑图

NMAP速查手册

1常用命令 1.1简单示例 使用ping检测10.0.0.0/24这个网段 1nmap -sP 10.0.0.0/24 使用SYN的方法对全端口进行扫描,在aggressive(4)的时间模板下,同时对开放的端口进行端口识别 1nmap -p1-65535 -sV -sS -T4 target PS: -T代表的是扫描的时候,一些控制选项(TCP的延迟时间,探测报文之间的间隔等)的集合,具体的man nmap一下就知道了使用SYN扫描,在aggressive(4)的时间模板下,探测操作系统的类型和版本,还有显示traceroute的结果,结果输出较为详细 1nmap -v-sS -A -T4 target 使用SYN扫描,在insane(5)的时间模板下,探测操作系统的类型和版本,还有显示traceroute的结果,结果输出较为详细 1nmap -v-sS -A -T5 target

使用SYN扫描,在insane(5)的时间模板下,探测操作系统的类型,还有显示traceroute的结果,操作系统的类型,结果输出较为详细 1nmap -v-sV -O -sS -T5 target 使用SYN的方法对全端口进行扫描,同时对开放的端口进行端口识别,在aggressive(4)的时间模板下,探测操作系统的类型还有显示traceroute的结果,结果输出较为详细 1nmap -v-p 1-65535 -sV -O -sS -T4 target 用SYN的方法对全端口进行扫描,同时对开放的端口进行端口识别,在insane(5)的时间模板下,探测操作系统的类型,还有显示traceroute的结果,结果输出较为详细 1nmap -v-p 1-65535 -sV -O -sS -T5 target 从文件中读取需要扫描的IP列表 1nmap -iL ip-address.txt 1.2Nmap输出格式 扫描的结果输出到屏幕,同时会存储一份到grep-output.txt 1nmap -sV -p 139,445 -oG grep-output.txt 10.0.1.0/24

Nmap中文教程

Nmap中文教程-详细版 用法: nmap 扫描类型(多个) [选项] {目标} 目标说明: 可以通过主机名,IP地址,网络等 例如:https://www.wendangku.net/doc/e513199087.html,,https://www.wendangku.net/doc/e513199087.html,/24, 192.168.0.1;10.0.0-255.1-254 -iL < 输入文件名>: 输入从主机/网络列表 -iR < 主机数量>: 选择随机指标 –exclude < 主机1[,主机2][,主机3],…>: 排除主机/网络 –excludefile <排除文件>: 从列表文件中排除 主机发现: -sL: 列表扫描–简单扫描列表目标 -sP: Ping扫描主机是否存在但不进行端口扫描。 -PN: 跳过主机发现,扫描所有主机不管是否开机。 -PS/PA/PU/PY[端口列表]: TCP SYN/ACK, UDP 或SCTP 发现指定的端口 -PE/PP/PM: ICMP echo, timestamp, 和netmask request发现 -PO [协议列表]:IP协议ping

-n/-R: 从不DNS解析/始终解析[默认: 有时] –dns-servers < 服务器1[,服务器2],…>: 指定自定义DNS服务器–system-dns: 使用操作系统的DNS解析器 –traceroute: 每个主机跟踪一跳路径 扫描技术: -sS:半开扫描,只进行两次握手。 -sT:全开扫描,完整的三次握手。 -sA: -sW: -sM: Maimon 扫描,使用FIN和ACK标志位。 TCP SYN/Connect()/ACK/Window/ -sU: UDP扫描 -sN/sF/sX: TCP Null, FIN, 和Xmas 扫描 –scanflags < 标志>: 自定义TCP扫描标志 -sI < 僵尸主机[:探测端口]>: 闲置扫描 -sY/sZ: SCTP INIT/COOKIE-ECHO 扫描 -sO: IP协议扫描 -b : 使用FTP bounce扫描

端口扫描

端口扫描 应用场景 随着计算机网络的普及和发展,人们利用网络可以方便快捷地进行各种信息处理,例如,网上办公、电子商务、分布式数据处理等。但网络也存在不容忽视的问题,例如,用户的数据被篡改、合法用户被冒充、通信被中断等。面临着大量的网络入侵事件,就必须要求在一个开放式的计算机网络物理环境中构造一个封闭的逻辑环境来保障敏感信息和保密数据不受到攻击。为此迫切需要对网络安全作分类研究,把各种网络安全问题清楚有序地组织起来,从而构建一个合理、安全、高效的网络防御体系。 网络安全保护的核心是如何在网络环境下保证数据本身的秘密性、完整性与操作的正确性、合法性与不可否认性。而网络攻击的目的正相反,其立足于以各种方式通过网络破坏数据的秘密性和完整性或进行某些非法操作。 网络及其应用的广泛发展,安全威胁呈现出攻击的种类、方法和总体数量越来越多、破坏性和系统恢复难度也越来越大。这就要求我们对攻击方法有更进一步的研究;对安全策略有更完善的发展,建立起一个全面的、可靠的、高效的安全体系。 端口扫描就是通过连接到目标系统的TCP 或UDP 端口,来确定什么服务正在运行。一个端口就是一个潜在的通信通道,也就是一个入侵通道。从对黑客攻击行为的分析和收集的漏洞来看,绝大多数都是针对某一个网络服务,也就是针对某一个特定的端口的。对目标计算机进行端口扫描,能得到许多有用的信息。 实验目标: ● 掌握端口扫描技术原理 ● 熟悉各种常用服务监听端口号 ● 掌握典型的端口扫描工具 实验环境: 虚拟机: Windows 2000,XP ,2003,Nmap 扫描软件 实验过程指导: 启动虚拟机,并设置虚拟机的IP 地址,以虚拟机为目标主机进行攻防试验。个别实验VM Server VM Client

相关文档