使用nslookup進行DNS查詢及wirekhark抓取DNS數據包

2022-02-02 程序猿編碼

nslookup 是一個查詢 Internet 域名伺服器的程序。我們通常使用nslookup工具來測試DNS解析,獲取DNS報文的詳細數據,這也是我們想要使用協議分析工具nslookup來分析DNS流量進行分析。

只要你上網,都會涉及DNS解析。簡單起見,我們這裡不會搭建一個DNS伺服器,而是使用Internet域名解析來分析驗證。

使用nslookup工具進行DNS查詢

nslookup 命令可用於許多作業系統,如 Windows、macOS 和 Linux 發行版。您可以使用它來執行 DNS 查詢並接收:域名或 IP 地址,或任何其他特定的 DNS 記錄。

nslookup命令可以在兩種模式下允許:交互式和非交互式。當需要返回單一查詢的結果,可以使用非交互式模式,語法如下:

nslookup [-option] [name | -] [server]

例如我們查詢一個baidu.com的命令結果如下


nslookup 後跟域名將顯示域的「A 記錄」(IP 地址)。使用此命令查找域的地址記錄。它查詢域名伺服器並獲取詳細信息。

如何檢查反向 DNS 查找?

很多時候您會檢查 A 記錄以查看域的 IP,但有時您需要驗證 IP 地址是否與特定域相關。為此,我們需要反向 DNS 查找。

下面來看看如何開啟nslookup調試模式。下面給出的是debug模式下部分代碼具體實現。

 puts("--");
 /*detailheader(query, msg);*/
 detailsection(query, msg, 1, DNS_SECTION_QUESTION);
 detailsection(query, msg, 1, DNS_SECTION_ANSWER);
 detailsection(query, msg, 1, DNS_SECTION_AUTHORITY);
 detailsection(query, msg, 1, DNS_SECTION_ADDITIONAL);
 puts("--");

static isc_result_t detailsection(dig_query_t *query, dns_message_t *msg, int headers,
      dns_section_t section) 
{
 isc_result_t result, loopresult;
 dns_name_t *name;
 dns_rdataset_t *rdataset = NULL;
 dns_rdata_t rdata = DNS_RDATA_INIT;
 char namebuf[DNS_NAME_FORMATSIZE];

 UNUSED(query);

 debug("detailsection()");

 if (headers) 
 {
  switch (section) 
  {
   
   case DNS_SECTION_QUESTION:
    puts("    QUESTIONS:");
    break;
   case DNS_SECTION_ANSWER:
    puts("    ANSWERS:");
    break;
   case DNS_SECTION_AUTHORITY:
    puts("    AUTHORITY RECORDS:");
    break;
   case DNS_SECTION_ADDITIONAL:
    puts("    ADDITIONAL RECORDS:");
    break;
  }
 }

 result = dns_message_firstname(msg, section);
 if (result == ISC_R_NOMORE)
  return (ISC_R_SUCCESS);
 else if (result != ISC_R_SUCCESS)
  return (result);
 for (;;) 
 {
  name = NULL;
  dns_message_currentname(msg, section,
     &name);
  for (rdataset = ISC_LIST_HEAD(name->list);
       rdataset != NULL;
       rdataset = ISC_LIST_NEXT(rdataset, link)) 
  {
   if (section == DNS_SECTION_QUESTION)
   {
    dns_name_format(name, namebuf,
      sizeof(namebuf));
    printf("\t%s, ", namebuf);
    dns_rdatatype_format(rdataset->type,
           namebuf,
           sizeof(namebuf));
    printf("type = %s, ", namebuf);
    dns_rdataclass_format(rdataset->rdclass,
            namebuf,
            sizeof(namebuf));
    printf("class = %s\n", namebuf);
   }
   loopresult = dns_rdataset_first(rdataset);
   while (loopresult == ISC_R_SUCCESS) 
   {
    dns_rdataset_current(rdataset, &rdata);

    dns_name_format(name, namebuf,
      sizeof(namebuf));
    printf("    ->  %s\n", namebuf);

    switch (rdata.type) 
    {
     case dns_rdatatype_soa:
      printsoa(&rdata);
      break;
     default:
      printf("\t");
      printrdata(&rdata);
    }
    dns_rdata_reset(&rdata);
    printf("\tttl = %u\n", rdataset->ttl);
    loopresult = dns_rdataset_next(rdataset);
     }
    }
   result = dns_message_nextname(msg, section);
   if (result == ISC_R_NOMORE)
    break;
   else if (result != ISC_R_SUCCESS) 
   {
    return (result);
   }
 }
 return (ISC_R_SUCCESS);
}

nslookup的交互模式

nslookup在交互模式下使用,進入交互狀態並執行相應的子命令,交互命令如下:


static void setoption(char *opt) 
{
 size_t l = strlen(opt);

 if (CHECKOPT("all", 3)) 
 {
  show_settings(1, 0);
 } 
 else if (strncasecmp(opt, "class=", 6) == 0) 
 {
  if (testclass(&opt[6]))
   strlcpy(defclass, &opt[6], sizeof(defclass));
 } 
 else if (strncasecmp(opt, "cl=", 3) == 0) 
 {
  if (testclass(&opt[3]))
   strlcpy(defclass, &opt[3], sizeof(defclass));
 } 
 else if (strncasecmp(opt, "type=", 5) == 0) 
 {
  if (testtype(&opt[5]))
   strlcpy(deftype, &opt[5], sizeof(deftype));
 } 
 else if (strncasecmp(opt, "ty=", 3) == 0) {
  if (testtype(&opt[3]))
   strlcpy(deftype, &opt[3], sizeof(deftype));
 } 
 else if (strncasecmp(opt, "querytype=", 10) == 0) 
 {
  if (testtype(&opt[10]))
   strlcpy(deftype, &opt[10], sizeof(deftype));
 } 
 else if (strncasecmp(opt, "query=", 6) == 0) 
 {
  if (testtype(&opt[6]))
   strlcpy(deftype, &opt[6], sizeof(deftype));
 } 
 else if (strncasecmp(opt, "qu=", 3) == 0) 
 {
  if (testtype(&opt[3]))
   strlcpy(deftype, &opt[3], sizeof(deftype));
 } 
 else if (strncasecmp(opt, "q=", 2) == 0) 
 {
  if (testtype(&opt[2]))
   strlcpy(deftype, &opt[2], sizeof(deftype));
 } 
 else if (strncasecmp(opt, "domain=", 7) == 0) 
 {
  strlcpy(domainopt, &opt[7], sizeof(domainopt));
  set_search_domain(domainopt);
  usesearch = 1;
 } 
 else if (strncasecmp(opt, "do=", 3) == 0) 
 {
  strlcpy(domainopt, &opt[3], sizeof(domainopt));
  set_search_domain(domainopt);
  usesearch = 1;
 } 
 else if (strncasecmp(opt, "port=", 5) == 0) 
 {
  set_port(&opt[5]);
 } 
 else if (strncasecmp(opt, "po=", 3) == 0) 
 {
  set_port(&opt[3]);
 } 
 else if (strncasecmp(opt, "timeout=", 8) == 0) 
 {
  set_timeout(&opt[8]);
 } 
 else if (strncasecmp(opt, "t=", 2) == 0) 
 {
  set_timeout(&opt[2]);
 } 
 else if (CHECKOPT("recurse", 3)) 
 {
  recurse = 1;
 } 
 else if (CHECKOPT("norecurse", 5)) 
 {
  recurse = 0;
 } 
 else if (strncasecmp(opt, "retry=", 6) == 0) 
 {
  set_tries(&opt[6]);
 } 
 else if (strncasecmp(opt, "ret=", 4) == 0) 
 {
  set_tries(&opt[4]);
 } 
 else if (CHECKOPT("defname", 3)) 
 {
  usesearch = 1;
 } 
 else if (CHECKOPT("nodefname", 5)) 
 {
  usesearch = 0;
 } 
 else if (CHECKOPT("vc", 2) == 0) 
 {
  tcpmode = 1;
 } 
 else if (CHECKOPT("novc", 4) == 0) 
 {
  tcpmode = 0;
 } 
 else if (CHECKOPT("debug", 3) == 0) 
 {
  short_form = 0;
  showsearch = 1;
 } 
 else if (CHECKOPT("nodebug", 5) == 0) 
 {
  short_form = 1;
  showsearch = 0;
 } 
 else if (CHECKOPT("d2", 2) == 0) 
 {
  debugging = 1;
 } 
 else if (CHECKOPT("nod2", 4) == 0) 
 {
  debugging = 0;
 } 
 else if (CHECKOPT("search", 3) == 0) 
 {
  usesearch = 1;
 }
 else if (CHECKOPT("nosearch", 5) == 0) 
 {
  usesearch = 0;
 } 
 else if (CHECKOPT("sil", 3) == 0) 
 {
  /* deprecation_msg = 0; */
 }
 else if (CHECKOPT("fail", 3) == 0) 
 {
  nofail=0;
 } 
 else if (CHECKOPT("nofail", 5) == 0) 
 {
  nofail=1;
 } 
 else if (strncasecmp(opt, "ndots=", 6) == 0) 
 {
  set_ndots(&opt[6]);
 } 
 else 
 {
  printf("*** Invalid option: %s\n", opt);
 }
}



static void interactive_command(char *input) 
{
 char *ptr, *arg;

 ptr = next_token(&input, " \t\r\n");
 if (ptr == NULL)
  return;
 arg = next_token(&input, " \t\r\n");
 if (strcasecmp(ptr, "set") == 0) 
 {
  if (arg == NULL)
   printf("Usage: set keyword=value, or set all\n");
  else
   setoption(arg);
 } 
 else if ((strcasecmp(ptr, "server") == 0) ||
   (strcasecmp(ptr, "lserver") == 0)) 
 {
  isc_result_t res;

  if (arg == NULL)
   printf("usage: server hostname\n");
  else if ((res = set_nameserver(arg))) 
  {
   printf("couldn't get address for '%s': %s\n",
       arg, isc_result_totext(res));
  } 
  else 
  {
   check_ra = 0;
   show_settings(1, 1);
  }
 } 
 else if (strcasecmp(ptr, "exit") == 0) 
 {
  in_use = 0;
 } 
 else if (strcasecmp(ptr, "help") == 0 ||
     strcasecmp(ptr, "?") == 0) 
 {
  printf("The '%s' command is not yet implemented.\n", ptr);
 } 
 else if (strcasecmp(ptr, "finger") == 0 ||
     strcasecmp(ptr, "root") == 0 ||
     strcasecmp(ptr, "ls") == 0 ||
     strcasecmp(ptr, "view") == 0) 
 {
  printf("The '%s' command is not implemented.\n", ptr);
 } 
 else
  addlookup(ptr);
}

常用的子命令為

nslookup [exit | finger | help | ls | lserver | root | server | set | view] [options]

exit :退出 nslookup 命令行工具finger :與當前計算機上的finger 伺服器連接help : 顯示子命令的簡短摘要ls: 列出 DNS 域的信息lserver : 改變默認域名伺服器root :將默認伺服器掛到DNS域名空間根的伺服器上server :指定域名伺服器set :此命令用於更改影響查找的狀態信息view:排序並列出前一個 ls 子命令或命令的輸出

在交互模式下正向解析,查詢域名信息。要中斷交互命令,可以使用ctrl + c組合鍵,要退出交互模式並返回到命令提示符,在命令提示符下輸入「exit」即可。


直接輸入要查詢的域名可返回域名的IP位址。輸入server可返回當前DNS伺服器的信息。

無論是交互式和非交互式,如果沒有指定DNS伺服器地址,nslookup命令將查詢當前計算機的默認DNS伺服器。

默認查詢主機地址,想要測試其他類型的資源記錄,先使用 set type命令設置要查詢的DNS記錄類型,然後輸入域名,可得到相應類型的域名測試結果。

類型值如下:

TYPE:
 A  IPv4 地址記錄
    AAAA IPv6 地址記錄  
 AFSDB  Andrew文件系統資料庫伺服器記錄 
 ATMA  ATM地址記錄 
 CNAME 別名記錄 
 HINFO 硬體配置記錄,包括CPU、作業系統信息 
 ISDN 域名對應的ISDN號碼 
 MB  存放指定郵箱的伺服器 
 MG  郵件組記錄 
 MINFO 郵件組和郵箱的信息記錄 
 MR  改名的郵箱記錄 
 MX  郵件伺服器記錄 
 NS  名字伺服器記錄 
 PTR  反向記錄 
 RP  負責人記錄 
 RT  路由穿透記錄 
 SRV  TCP伺服器信息記錄 
 TXT  域名對應的文本信息 
 X25  域名對應的X.25地址記錄

舉例如下:

如何查找域的所有可用 DNS 記錄。

nslookup -type=any baidu.com

這個查找範圍很大。在這裡,我們要查看所有可用的 DNS 記錄。在看到所有這些之後,我們可以對不同類型的 DNS 記錄進行特定查找。


捕獲DNS流量驗證報文格式

網絡訪問只要涉及域名,都會執行DNS解析,如ping ,web訪問等等。下面我們使用nslookup命令查詢域名baidu.com 。

下圖是使用wireshark進行抓取DNS數據包


這是一個簡單的DNS解析過程,序號為56的數據包顯示的是DNS查詢報文,序號為57是數據包是DNS應答報文。

下面我們講講56序號的詳細數據。

這裡我們展開了Domain Name System節點。客戶端向伺服器發送DNS查詢報文,這是一個標準查詢(Standard Query),我們可以理解為正向解析。

查詢報文分為首部和問題兩個部分。首部包含ID,標誌和計數器3類欄位。Opcode值為0表示標準查詢。

Question為1表示只有一個查詢報文,其他3個資源記錄數均為0。問題部分給出了要查詢的域名、類型、和類。

這個報文封裝在UDP協議上,發往DNS伺服器,傳輸的目的埠號為53.

下面我們講講57序號的詳細數據。


這裡我們展開了Domain Name System節點。伺服器返回客戶端DNS應答報文。應答報文分為首部、問題、回答、權威、附加5個部分。

首部包含ID,標誌和計數器3類欄位。ID與查詢報文相同。Question為1表示只有一個查詢報文,其他3個資源記錄數給出了相應的數目,問題部分與查詢部分相同

在展開Answers節點。每條記錄都包括名稱、類型、類、生存時間、數據長度和數據6個欄位。

總結

nslookup 是流行的 DNS 探測命令行軟體之一。可以使用它來監控您的網絡並發現有問題的區域。如果大家感興趣,可以研究研究類似的工具,比如dig、traceroute 、ping等等。


看完一鍵三連在看,轉發,點讚。歡迎關注微信公眾號【程序猿編碼】,歡迎添加本人微信號(c17865354792)交流學習。

相關焦點

  • 利用 nslookup 解析 DNS 記錄
    本文作者:secES(來自信安之路學習交流群)贈送書籍:《Kali Linux高級滲透測試(原書第2版)》nslookup 是一個域名解析工具
  • ​Kubernetes中Coredns查詢記錄
    查詢記錄工作中我遇到coredns的相關錯誤性問題很多,很多都是用戶那邊在使用k8s當中,或者調試當中遇到的一些錯誤性問題,這裡會有一些總結,另外對於它的解析查詢記錄原理是作為一名前線人員是一項必備技能,遇到問題如何解決我們要懂它的原理以及解析過程中的記錄查詢是怎樣流轉的,如果知道這些對我們排查過程會起很大的幫助
  • 全面提升BINDDNS伺服器安全
    4.緩衝區漏洞溢出攻擊黑客利用DNS伺服器軟體存在漏洞,比如對特定的輸入沒有進行嚴格檢查,那么有可能被攻擊者利用,攻擊者構造特殊的畸形數據包來對DNS伺服器進行緩衝區溢出攻擊。如果這一攻擊成功,就會造成DNS服務停止,或者攻擊者能夠在DNS伺服器上執行其設定的任意代碼。
  • DNS詳解(六)幾種常見的DNS攻擊方式
    傳統DNS緩存投毒攻擊目前DNS採用UDP協議傳輸查詢和應答數據包,採用簡單信任機制,對首先收到的應答數據包僅進行原查詢包發送IP位址、埠和隨機查詢ID的確認,而不會對數據包的合法性做任何分析,若匹配,則接受其作為正確的應答數據包
  • DNS伺服器地址大全
    (2)修改方法:通過具有條件的公司註冊的國際域名變更DNS:用戶可通過和提供服務的該公司進行協商(大致步驟為:提出申請並提交相關材料後該業務公司會在2個工作日左右完成變更)。6、域名修改DNS是否收費?國際英文域名、國內英文域名可以修改DNS,這項服務是免費的。7、為什麼DNS註冊成功,但仍無法使用?
  • 簡單可行的dns使用方案
    使用adguard home,smartdns,dnsmasq,dnscrypt-proxy等等都是比較實用的dns方案,不過設置可能稍微比較麻煩一點。這一篇可能有一點經驗之談,也不一定對,不同地區不同運營商差別都是比較大的。1、如果沒有dns劫持情況,還是推薦使用當地運營商的dns為主。
  • Linux系統下DNS伺服器的架設
    2安裝Bind的RPM包。3下載Bind軟體原始碼,然後編譯安裝。若採用前兩種方式,輸入「rpm–qbind」後會顯示bind的相關信息,否則沒有信息顯示。Bind安裝完畢後,需要按以下步驟進行配置: 一、修改/etc/host.conf和/etc/resolve.conf文件 Resolve.conf文件內容為domainqtech.edu.cn//要解析的域nameserver211.64.192.X//dns伺服器
  • 如何清除dns緩存
    在我們日常使用電腦中進行網絡翻牆後,訪問網頁會提示無法訪問網頁,而插卡網絡是已連接狀態且app聊天軟體都可以使用, 這個問題的根源就出現在dns上, 因為使用翻牆後他會把本地的dns進行更改,使用完後由於dns還沒有更改回來所導致不能訪問網頁的問題 接下來說一些清楚dns緩存的方法
  • sqlmap利用DNS進行oob(out of band)注入
    使用pdo連接方式,可以執行多語句,但是PDO只會返回第一條SQL語句的執行結果,所以一般不能直接拿到數據,被迫通過update某個可見欄位或者sleep注入3、遇到waf攔截,含有特定內容的返回包接受不到,明明測試沒有攔截過濾,感覺執行成功了,卻沒有接收到返回數據(能執行命令的時候也可以向web目錄寫文件)0x02原理使用unc路徑,會對指定的域名進行
  • 詳解DNS 與 CoreDNS 的實現原理
    對於 DNS 解析器,這裡使用的 DNS 查詢方式是迭代查詢,每個 DNS 服務並不會直接返回 DNS 信息,而是會返回另一臺 DNS 伺服器的位置,由客戶端依次詢問不同級別的 DNS 服務直到查詢得到了預期的結果;另一種查詢方式叫做遞歸查詢,也就是 DNS 伺服器收到客戶端的請求之後會直接返回準確的結果,如果當前伺服器沒有存儲 DNS 信息,就會訪問其他的伺服器並將結果返回給客戶端
  • dns查詢方式匯總【圖文】
    當然是對dns進行查詢了,本文就為其查詢方式做了全面的匯總。   4,所以在下次遇到故障的時候,我們只要能把DNS伺服器的地址查詢到,就能根據TCP/IP協議輕鬆解決了。但只要我們進行簡單的設置,就能很好的找到伺服器的地址,並且快速有效地解決問題。  第二種方法:  1,把電腦打開之後點擊左下角的開始菜單,選擇裡面的控制面板功能。  2,當控制面板功能打開之後,要雙擊「網絡連接」菜單,這樣就能進入網絡連接的設置頁面。
  • MassDNS:一款功能強大的高性能DNS子域名查詢枚舉偵察工具
    如果你使用的不是Linux作業系統,那麼則需要運行下列命令:make nolinux在Windows平臺下,你還需要安裝Cygwin包、gcc-core、git和make。工具使用Usage: ./bin/massdns -r lists/resolvers.txt -t AAAA -w results.txt domains.txt樣本輸出默認配置下,MassDNS將會輸出響應數據包,格式為文本格式,輸出樣例如下:;; Server: 77.41.229.2:53 ;; Size: 93 ;; Unix time: 1513458347
  • 關於 DNS 看這一篇就夠了
    事務 ID:DNS 報文的 ID 標識。通過它可以區分 DNS 應答報文是對哪個請求進行響應的。附加資源記錄數:額外的記錄數目(權威名稱伺服器對應 IP 地址的數目)。7. Wireshark抓包實戰打開 Wireshark 後,使用 ping 163.com 來發起 DNS 解析請求,使用 DNS 關鍵字在Wireshark 過濾。
  • 探測Cobalt Strike DNS重定向服務
    DNS-使用各種DNS查詢,Cobalt Strike的beacon可以僅使用DNS與C2伺服器通信,優點是名稱解析幾乎總是被允許的,並且在植入伺服器和C2伺服器之間沒有直接通信,因為DNS解析將使用默認的名稱伺服器進行。Custom-使用記錄良好的外部C2協議,該機制可使用戶自定義通信方式,可不依賴於Cobalt Strike的默認信道。一個有名的例子是F-Secure的C3框架。
  • 如何通過nslookup指令查詢某個域名的域名解析記錄(dns記錄)?
    如何通過nslookup指令查詢某個域名的域名解析記錄(dns記錄)?作為網站站長,時刻要了解自己網站或者是別人的網站的解析有沒有生效,我們可以在本地的電腦上面使用nslookup命令來查詢域名的dns解析記錄。nslookup可以指定查詢的類型,可以查到DNS記錄的生存時間還可以指定使用那個DNS伺服器進行解析。
  • CVE-2020-25705/SAD DNS:DNS緩存投毒攻擊
    DNS轉發成為新的攻擊面 DNS 會向特定時期內的IP 地址查詢響應緩存作為改善網絡性能的方法。攻擊者可以利用這種機制通過偽造給定網站的IP 地址DNS記錄對緩存進行投毒,並重定向用戶到攻擊者選擇的另一個網站。
  • dns劫持是什麼意思? dns被劫持解決方法介紹
    川北在線核心提示:原標題:dns劫持是什麼意思? dns被劫持解決方法介紹 dns劫持是什麼意思?DNS劫持又叫做域名劫持,是黑客入侵網站的一種常用手段,這種攻擊會對網站訪問返回假的信息,甚至是訪問失敗,遇到這麼問題的時候應該如何解決呢?
  • 入口保衛戰,探究DNS隧道「隱秘的角落」
    利用DNS隧道竊取數據已成為APT攻擊的重要組成部分,而DNS服務埠UDP 53通常不會被防火牆管控,這也為攻擊者利用DNS進行隱蔽通信提供了便利的條件。本文以dnscat2和dns2tcp開源工具為基礎,搭建實驗環境並模擬洩露過程,分析其通信數據,分享針對DNS隧道可能的防護維度(工具的搭建過程不在本文介紹範疇)。
  • No.323 保護你的DNS查詢隱私(2020-08-23)
    第一點,默認的大部分情況下,你的PC和手機終端大都是通過DHCP獲取動態IP位址的同時、獲取到DHCP服務指派的DNS服務IP位址,然後通過UDP 53明文方式進行
  • centos7搭建DNS詳細教程
    今天小編帶大家搭建linux的DNS伺服器:1.首先安裝bind軟體包 yum install bind -y;(也可以用rpm命令,由於這個命令需要先掛載比較麻煩)yum需要聯網使用;/var/named/zheng.com.zone來查看是否配置參數錯誤6.客戶端配置dns:vi /etc/resolv.conf