Skip to content

Commit a5c77c0

Browse files
committed
Few more scripts
1 parent 883f588 commit a5c77c0

File tree

4 files changed

+98
-1
lines changed

4 files changed

+98
-1
lines changed

network/README.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
# Network scripts
22

3-
* `extract_iocs.py` : extract potential network indicators using tshark
3+
* `extract_iocs.py` : extract potential network indicators from a PCAP file using tshark
4+
* `dns_resolve.py` : resolve domains, results in a CSV file

network/dns_resolve.py

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import os
2+
import argparse
3+
from dns import resolver, reversename, exception
4+
5+
6+
if __name__ == "__main__":
7+
parser = argparse.ArgumentParser(description='Resolve domains')
8+
parser.add_argument('TXTFILE', help='Text files with domains')
9+
parser.add_argument('--verbose', '-v', action='store_true',
10+
help='verbose mode')
11+
args = parser.parse_args()
12+
13+
results = {}
14+
15+
with open(args.TXTFILE) as f:
16+
data = f.read().split("\n")
17+
18+
for d in data:
19+
dd = d.strip()
20+
if dd not in results and len(dd) > 0:
21+
try:
22+
res = resolver.query(dd, "A")
23+
except (resolver.NoAnswer, resolver.NXDOMAIN):
24+
results[dd] = [True, ""]
25+
if args.verbose:
26+
print("{}: NXDOMAIN".format(dd))
27+
except resolver.NoNameservers:
28+
results[dd] = [False, "SERVFAIL"]
29+
if args.verbose:
30+
print("{}: SERVFAIL".format(dd))
31+
except exception.Timeout:
32+
results[dd] = [False, "Timeout"]
33+
if args.verbose:
34+
print("{}: Timeout".format(dd))
35+
else:
36+
addr = [r.address for r in res]
37+
results[dd] = [True, addr]
38+
if args.verbose:
39+
print("{}: {}".format(dd, addr))
40+
with open("resolutions.csv", "w+") as f:
41+
f.write("Domain,Success,Resolution\n")
42+
for domain in results.keys():
43+
f.write("{},{},{}\n".format(
44+
domain,
45+
results[domain][0],
46+
";".join(results[domain][1])
47+
))
48+
49+
print("Results written in resolutions.csv")
50+
51+
52+
53+

pt/README.md

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Passive Total scripts
2+
3+
* `get_ip_domains.py` : extract all the domains for an IP address

pt/get_ip_domains.py

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#!/usr/bin/env python3
2+
import requests
3+
import os
4+
import sys
5+
import json
6+
import argparse
7+
from passivetotal.libs.dns import DnsRequest
8+
9+
def get_config():
10+
conf_file = os.path.join(os.path.expanduser("~"), ".config/passivetotal/api_config.json")
11+
if os.path.isfile(conf_file):
12+
with open(conf_file, 'r') as f:
13+
conf = json.loads(f.read())
14+
else:
15+
print('No config file')
16+
sys.exit(1)
17+
return conf
18+
19+
20+
if __name__ == '__main__':
21+
parser = argparse.ArgumentParser(description='Extract all domains from an IP address')
22+
parser.add_argument('IP', help='an IP address')
23+
args = parser.parse_args()
24+
25+
conf = get_config()
26+
27+
client = DnsRequest(conf['username'], conf['api_key'])
28+
raw_results = client.get_passive_dns(query=args.IP)
29+
print("{} domains identified".format(len(raw_results["results"])))
30+
31+
csvout = open("csv.out", "w+")
32+
csvout.write("Domain,First,Last,Type\n")
33+
for r in raw_results["results"]:
34+
csvout.write("{},{},{},{}\n".format(
35+
r['resolve'],
36+
r['firstSeen'],
37+
r['lastSeen'],
38+
r['recordType']
39+
))
40+
print("extracted in csv.out")

0 commit comments

Comments
 (0)