激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 用python實現域名資產監控的詳細步驟

用python實現域名資產監控的詳細步驟

2022-02-25 13:18炒雞辣雞123 Python

域名資產監控,通過輸入一個主域名,找到該域名對應的ip地址所在的服務器的端口開閉情況,本文重點給大家介紹用python實現域名資產監控的問題,需要的朋友可以參考下

應用場景

域名資產監控,通過輸入一個主域名,找到該域名對應的ip地址所在的服務器的端口開閉情況。通過定期做這樣的監控,有助于讓自己知道自己的資產的整體暴露面情況。

 

所需要具備的前綴技能

python的簡單使用

linux操作系統的簡單使用

DNS的原理

 

工具

pycharm 專業版

xshell 用于部署腳本

 

步驟

通過域名得到對應的ip地址

首先,我們知道對于一個域名來說,可以設置很多類型的記錄值,比如A記錄、AAAA記錄、SOA記錄、TXT記錄等等。安全領域常見的記錄值和其含義對應關系如下:

 

代碼 描述
A IPv4地址記錄
AAAA IPv6地址記錄
CNAME 規范名稱記錄,一個主機名字的別名:
域名系統將會繼續嘗試查找新的名字
MX 電郵交互記錄
NS 名稱服務器記錄
PTR 最常用來運行反向DNS查找
SOA 權威記錄的起始
TXT 文本記錄
而我們要用到的就是A記錄(目前IPv6用得不廣泛)。

通過A記錄,獲取到一個域名對應的IP地址,用python實現的方法如下:

def dns_a(domain: str):
  dns_servers = '114.114.114.114,114.114.115.115,223.5.5.5,223.6.6.6,180.76.76.76,119.29.29.29,119.29.29.29,1.2.4.8,210.2.4.8,117.50.11.11,52.80.66.66,101.226.4.6,218.30.118.6,123.125.81.6,140.207.198.6,8.8.8.8,8.8.4.4,9.9.9.9,208.67.222.222,208.67.220.220'.split(
      ',')
  loop = asyncio.new_event_loop()
  resolver = aiodns.DNSResolver(loop=loop)
  resolver.nameservers = dns_servers
  try:
      record_a = loop.run_until_complete(resolver.query(domain, 'A'))
      return record_a
  except:
      pass
  return []

在代碼中,為每一次查詢隨機指定了一個dns_server,也就是dns查詢服務器,由于收斂的關系,不同的查詢服務器結果可能不相同。所以可以考慮做得完善一些,這里只查詢了一次,也可以換多個dns服務器查詢多次,取并集(并集是不放過所有可能情況,交集是精確但可能漏)。最終該方法就可以實現獲取域名對應的ip地址。

這個方法中使用到了asyncio和aiodns兩個包,安裝方法如下:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn asyncio,aiodns

下面我們以www.mengwa.store為例,看看結果如何:

用python實現域名資產監控的詳細步驟

可以發現ip地址有了,不過,還需要從結果中進行提取。方法如下:

record_a = dns_a(domain)
ips = []
if type(record_a) == list:
ips = sorted([answer.host for answer in record_a])

這個ips中存儲的就是排序后的解析記錄ip列表。

對ip地址進行端口掃描

通過上面的步驟找到了ip地址,下一步就是對ip地址進行端口掃描??稍趻呙柚?,我們還有一個步驟需要做,需要判斷當前ip所在的機器是否存活。

可能你立馬就想到了ping方法,可是在安全領域,有很多公司都要求服務器將ICMP協議給阻止掉,也就是說,ping方法可能返回超時,但是機器并不一定沒有開啟,只是主動給你把請求攔截掉了。

這里我們使用nmap的-sPn參數進行掃描,以www.mengwa.store對應的ip地址47.119.137.0為例:

用python實現域名資產監控的詳細步驟

然后我們通過代碼來實現這一邏輯,我們使用python-nmap包,安裝步驟如下:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn python-nmap

代碼如下:

def check_ip_reachable(ip: str):
  nm = nmap.PortScanner()
  xx = nm.scan(hosts=ip, arguments='-sP') # -sPn也可以
  if 'scan' in xx:
      i = xx.__getitem__('scan')
      if ip in i:
          j = i.__getitem__(ip)
          if 'status' in j:
              status = j['status']
              if 'state' in status:
                  state = status['state']
                  print(ip, state)
                  return state
  print(ip, 'down')
  return 'down'

做這一步的前提是,你本機安裝了nmap。

通過這里做判斷,如果ip所在機器是開啟狀態,那么我們就可以對其進行端口掃描了。

代碼如下:

# 實現對端口進行掃描,并且返回結果。使用nmap實現
def port_scan(ip: str):
  second = check_ip_reachable(ip)
  if second is not None and second == 'up':
      nm = nmap.PortScanner()
      xx = nm.scan(ip)
      print(nm.command_line())
      ans = []
      if 'scan' in xx:
          i = xx.__getitem__('scan')
          if ip in i:
              j = i.__getitem__(ip)
              if 'tcp' in j:
                  tcp = j['tcp']
                  for port in tcp:
                      ans.append(port)
      ans = sorted(ans)
      return ans
  else:
      write_to_file('output/' + time_now + '/ips.txt', ip + ' 不可達\n')
  return []

nm.command_line()方法可以打印出當前執行的命令行。(本質上這個包就是一個命令行調用包,然后做解析)

以47.119.137.0為例,結果如下:

用python實現域名資產監控的詳細步驟

這里的方法,使用的是nmap默認掃描的常見端口,如果有需要,也可以通過給Scan方法,加入Ports參數,自定義要掃描的端口,甚至于全端口。

串聯起來,實現通過域名到端口監控

def handle_ip(ip: str):
  if not task_ip_set.__contains__(ip):
      try:
          print('ip:' + ip, '開始端口掃描')
          port_result = port_scan(ip)
          val = ''
          print('ip:', ip, '發現端口', port_result)
          for i in port_result:
              val = val + '\n' + ip + "----" + i.__str__()
          write_to_file('output/' + time_now + '/ip_ports.txt', val)
          task_ip_set.add(ip)
      except Exception as e:
          print(e)
          
def handle_domain(domain: str):
  if not task_domain_set.__contains__(domain):
      print('domain:' + domain)
      record_a = dns_a(domain)
      ips = []
      if type(record_a) == list:
          ips = sorted([answer.host for answer in record_a])
      val = ''
      for i in ips:
          val = val + '\n' + domain + "----" + i.__str__()
      write_to_file('output/' + time_now + '/domain_ips.txt', val)
      print(ips)
      for i in ips:
          handle_ip(i)

這里使用了task_domain_set和task_ip_set用于對作用目標進行去重。

那么,到這里我們的任務完成了嗎?

沒有

 

子域名發現

如果我的主域名資產有很多二級域名,而我自己又對自己有哪些子域名不清楚,那么這個時候就需要做子域名發現。然后對每一個子域名調用前面的方法,找到其對應的ip開放的端口。

子域名發現一般來說有三種方法:

第一種通過對主域名所在網站進行爬取,從內容中解析出子域名;

第二種通過外部的查詢網站獲取結果,比如crt、virustotal、fofa等;

第三種通過字典爆破獲取結果,通過不斷的輪詢dns服務器,查詢其是否有A記錄的值,如果有,則表明該子域名存在,如果沒有則暫時認為該子域名不存在。

第一種方法,需要實現一個爬蟲,拿到網站的內容后利用正則表達式提取里面的子域名,提取的方法如下:

def get_subdomains(value: str, domain: str):
  x = f'(?P<subdomain>[a-zA-Z0-9.]+{domain})'
  pattern = re.compile(x)
  y = pattern.findall(value)
  ans = set()
  for i in y:
      ans.add(i)
  print(ans)
  return ans

第二種方法,利用接口調用,參見相關的API接口即可。

第三種方法,子域名爆破。核心代碼如下

answers = await self.resolvers[j].query(cur_domain, 'A') # 查找A記錄
# 如果A記錄有值且沒有報錯,則說明該子域名存在

當你完成上面的步驟,并且去重之后,就可以將這些子域名作為前面步驟的輸入。這樣,對于用戶需要監控的某個主域名而言,監控到的范圍就提升了很多。

請勿用于非已有域名的監控,造成的損失與本人無關。以上測試數據均為本人已有域名和ip。

到此這篇關于用python實現域名資產監控的文章就介紹到這了,更多相關python域名資產監控內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/xielinrui123/article/details/121192954

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩视频在线观看免费 | 成人在线观看小视频 | 91久久久久久久久久久久久久 | 91精品国产91热久久久做人人 | 色中色在线视频 | 天使萌一区二区三区免费观看 | 麻豆小视频在线观看 | 91午夜免费视频 | 国产日韩在线观看一区 | 视频在线中文字幕 | 国产毛片在线高清视频 | 最新精品在线 | 国产一级午夜 | 国产黄网 | 羞羞的视频 | 久久国产一级 | 精品国产乱码久久久久久丨区2区 | 草莓视频在线导航 | 99热99精品 | 精品成人网 | 韩国19禁在线 | 成人福利网 | 亚洲第一成人在线视频 | 欧美一级片网站 | 性高跟鞋xxxxhd4kvideos | 香蕉黄色网 | 92看片淫黄大片一级 | 国产日本在线播放 | 日本网站一区二区三区 | av免费不卡国产观看 | 国产青草视频在线观看 | 999精品国产| 黄色av.com | 免费a级毛片永久免费 | 91香蕉影视| 亚洲5区| 日本成人一二三区 | 男人的天堂色偷偷 | 亚洲国产精品一区 | 免费国产之a视频 | 成人免费毛片明星色大师 |