Using iplocate to geolocate IP addresses in Splunk.
Overview
Converting an IP address into a physical location can greatly enhance an Incident Responder’s decision-making process. It enables them to identify patterns or eliminate irrelevant data by focusing on specific countries. With the use of the |iplocate
command in Splunk, what was once considered a complex and specialized skill becomes a straightforward task.
Technical Details
In this example, the Zeek connection data is enhanced by including the geolocated source IP address for each connection.
To begin, we will use a simple Zeek conn_log query that focuses on:
- Identifying connections made to a specific host
- Filtering out external IP addresses
- Selecting connections that involved a download of more than 5K bytes
index=zeek sourcetype=zeek_conn id.resp_h=192.168.86.100 AND (id.resp_p=80 OR id.resp_p=443) AND resp_bytes>5000 AND (id.orig_h!=10.0.0.0/8)
| table _time, id.orig_h, id.resp_p, conn_state, duration, resp_shunted_bytes, resp_ip_bytes, resp_bytes
| sort -resp_bytes
Which outputs:
_time id.orig_h id.resp_p conn_state duration resp_shunted_bytes resp_ip_bytes resp_bytes
2023-06-15 14:22:44.455 151.73.38.94 80 SF 10.873228073120117 3274 4294968721
2023-06-15 06:14:02.512 120.86.253.36 80 SF 19.41591215133667 3316 4294968702
2023-06-15 18:25:39.162 52.114.128.147 80 SF 0.04450201988220215 2038 4294968103
2023-06-15 07:03:25.599 61.61.179.143 80 SF 0.23454689979553223 1318 4294967823
2023-06-15 13:08:06.943 3.235.31.29 80 SF 0.05164289474487305 1274 4294967801
2023-06-15 11:48:34.510 176.194.53.33 80 SF 20.484610080718994 1258 4294967713
...
Now, let’s enrich the source IP address (id.orig_h) with the City and Country it originated from, then use this information to exclude everything from the United States:
index=zeek sourcetype=zeek_conn id.resp_h=192.168.86.100 AND (id.resp_p=80 OR id.resp_p=443) AND resp_bytes>5000 AND (id.orig_h!=10.0.0.0/8)
| iplocation id.orig_h
| where Country!="United States"
| table _time, id.orig_h, City, Country, id.resp_p, conn_state, duration, resp_shunted_bytes, resp_ip_bytes, resp_bytes
| sort -resp_bytes
Which outputs:
_time id.orig_h City Country id.resp_p conn_state duration resp_shunted_bytes resp_ip_bytes resp_bytes
2023-06-15 14:22:44.455 151.73.38.94 Rho Italy 80 SF 10.873228073120117 3274 4294968721
2023-06-15 06:14:02.512 120.86.253.36 Shenzhen China 80 SF 19.41591215133667 3316 4294968702
2023-06-15 07:03:25.599 61.61.179.143 Tuniugou Taiwan 80 SF 0.23454689979553223 1318 4294967823
2023-06-15 11:48:34.510 176.194.53.33 Moscow Russia 80 SF 20.484610080718994 1258 4294967713
2023-06-15 20:57:27.714 119.224.103.159 Auckland (Auckland CBD) New Zealand 443 SF 0.39174818992614746 654 4294967303
2023-06-15 20:57:26.480 119.224.103.159 Auckland (Auckland CBD) New Zealand 443 SF 0.41156911849975586 550 4294967303
2023-06-15 22:12:57.538 194.165.16.78 Vilnius Lithuania 443 RSTO 0.2701132297515869 264 4294967296
2023-06-15 05:20:56.761 36.88.180.115 Jakarta Indonesia 80 SF 24.700366020202637 629 2107393772
2023-06-15 07:33:32.710 94.189.166.118 Belgrade Serbia 443 RSTO 14.081745862960815 2348967 1892331044
2023-06-15 07:32:19.574 94.189.166.118 Belgrade Serbia 443 RSTO 39.91005301475525 2616378 1581744615
...