feat: add Snort2 and Suricata rulesets
This commit is contained in:
		
							parent
							
								
									ed73297034
								
							
						
					
					
						commit
						d76146515c
					
				
							
								
								
									
										76
									
								
								README.md
								
								
								
								
							
							
						
						
									
										76
									
								
								README.md
								
								
								
								
							|  | @ -14,6 +14,8 @@ There are multiple formats available, refer to the appropriate section according | |||
| - [BIND](#bind) | ||||
| - [Unbound](#unbound) | ||||
| - Internet Explorer -> [Tracking Protection List (IE)](#tracking-protection-list-ie) | ||||
| - [Snort2](#snort2) | ||||
| - [Suricata](#suricata) | ||||
| 
 | ||||
| Not sure which format to choose? See [Compatibility](https://gitlab.com/curben/urlhaus-filter/wikis/compatibility) page. | ||||
| 
 | ||||
|  | @ -269,6 +271,80 @@ This blocklist includes domains only. | |||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| ## Snort2 | ||||
| 
 | ||||
| This ruleset includes online URLs only. Not compatible with Snort3. | ||||
| 
 | ||||
| ### Install | ||||
| 
 | ||||
| ``` | ||||
| # Download ruleset | ||||
| curl -L "https://curben.gitlab.io/phishing-filter-mirror/phishing-filter-snort2.rules" -o "/etc/snort/rules/phishing-filter-snort2.rules" | ||||
| 
 | ||||
| # Create a new cron job for daily update | ||||
| printf '#!/bin/sh\ncurl -L "https://curben.gitlab.io/phishing-filter-mirror/phishing-filter-snort2.rules" -o "/etc/snort/rules/phishing-filter-snort2.rules"\n' > /etc/cron.daily/phishing-filter | ||||
| 
 | ||||
| # cron job requires execution permission | ||||
| chmod 755 /etc/cron.daily/phishing-filter | ||||
| 
 | ||||
| # Configure Snort to use the ruleset | ||||
| printf "\ninclude \$RULE_PATH/phishing-filter-snort2.rules\n" >> /etc/snort/snort.conf | ||||
| ``` | ||||
| 
 | ||||
| - https://curben.gitlab.io/phishing-filter-mirror/phishing-filter-snort2.rules | ||||
| 
 | ||||
| <details> | ||||
| <summary>Mirrors</summary> | ||||
| 
 | ||||
| - https://cdn.statically.io/gl/curben/phishing-filter/master/dist/phishing-filter-snort2.rules | ||||
| - https://glcdn.githack.com/curben/phishing-filter/raw/master/dist/phishing-filter-snort2.rules | ||||
| - https://raw.githubusercontent.com/curbengh/phishing-filter/master/dist/phishing-filter-snort2.rules | ||||
| - https://cdn.statically.io/gh/curbengh/phishing-filter/master/dist/phishing-filter-snort2.rules | ||||
| - https://gitcdn.xyz/repo/curbengh/phishing-filter/master/dist/phishing-filter-snort2.rules | ||||
| - https://cdn.jsdelivr.net/gh/curbengh/phishing-filter/dist/phishing-filter-snort2.rules | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| ## Suricata | ||||
| 
 | ||||
| This ruleset includes online URLs only. | ||||
| 
 | ||||
| ### Install | ||||
| 
 | ||||
| ``` | ||||
| # Download ruleset | ||||
| curl -L "https://curben.gitlab.io/phishing-filter-mirror/phishing-filter-suricata.rules" -o "/etc/suricata/rules/phishing-filter-suricata.rules" | ||||
| 
 | ||||
| # Create a new cron job for daily update | ||||
| printf '#!/bin/sh\ncurl -L "https://curben.gitlab.io/phishing-filter-mirror/phishing-filter-suricata.rules" -o "/etc/suricata/rules/phishing-filter-suricata.rules"\n' > /etc/cron.daily/phishing-filter | ||||
| 
 | ||||
| # cron job requires execution permission | ||||
| chmod 755 /etc/cron.daily/phishing-filter | ||||
| ``` | ||||
| 
 | ||||
| Configure Suricata to use the ruleset: | ||||
| 
 | ||||
| ``` diff | ||||
| # /etc/suricata/suricata.yaml | ||||
| rule-files: | ||||
|   - local.rules | ||||
| +  - phishing-filter-suricata.rules | ||||
| ``` | ||||
| 
 | ||||
| - https://curben.gitlab.io/phishing-filter-mirror/phishing-filter-suricata.rules | ||||
| 
 | ||||
| <details> | ||||
| <summary>Mirrors</summary> | ||||
| 
 | ||||
| - https://cdn.statically.io/gl/curben/phishing-filter/master/dist/phishing-filter-suricata.rules | ||||
| - https://glcdn.githack.com/curben/phishing-filter/raw/master/dist/phishing-filter-suricata.rules | ||||
| - https://raw.githubusercontent.com/curbengh/phishing-filter/master/dist/phishing-filter-suricata.rules | ||||
| - https://cdn.statically.io/gh/curbengh/phishing-filter/master/dist/phishing-filter-suricata.rules | ||||
| - https://gitcdn.xyz/repo/curbengh/phishing-filter/master/dist/phishing-filter-suricata.rules | ||||
| - https://cdn.jsdelivr.net/gh/curbengh/phishing-filter/dist/phishing-filter-suricata.rules | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| ## Issues | ||||
| 
 | ||||
| This blocklist operates by blocking the **whole** website, instead of specific webpages; exceptions are made on popular websites (e.g. `https://docs.google.com/`), in which webpages are specified instead (e.g. `https://docs.google.com/phishing-page`). Phishing webpages are only listed in [URL-based](#url-based) filter, popular websites are excluded from other filters. | ||||
|  |  | |||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -29,6 +29,7 @@ bunzip2 -kc "phishtank.bz2" > "phishtank.csv" | |||
| 
 | ||||
| ## Parse URLs | ||||
| cat "phishtank.csv" | \ | ||||
| tr "[:upper:]" "[:lower:]" | \ | ||||
| ## Workaround for column with double quotes | ||||
| "./$CSVQUOTE" | \ | ||||
| cut -f 2 -d "," | \ | ||||
|  | @ -41,6 +42,7 @@ sed "s/^www\.//g" > "phishtank.txt" | |||
| 
 | ||||
| cat "openphish-raw.txt" | \ | ||||
| dos2unix | \ | ||||
| tr "[:upper:]" "[:lower:]" | \ | ||||
| cut -f 3- -d "/" | \ | ||||
| grep -F "." | \ | ||||
| sed "s/^www\.//g" > "openphish.txt" | ||||
|  | @ -63,6 +65,7 @@ cp "../src/exclude.txt" "." | |||
| ## Parse the Umbrella 1 Million | ||||
| unzip -p "top-1m-umbrella.zip" | \ | ||||
| dos2unix | \ | ||||
| tr "[:upper:]" "[:lower:]" | \ | ||||
| # Parse domains only | ||||
| cut -f 2 -d "," | \ | ||||
| grep -F "." | \ | ||||
|  | @ -73,6 +76,7 @@ sort -u > "top-1m-umbrella.txt" | |||
| ## Parse the Tranco 1 Million | ||||
| unzip -p "top-1m-tranco.zip" | \ | ||||
| dos2unix | \ | ||||
| tr "[:upper:]" "[:lower:]" | \ | ||||
| # Parse domains only | ||||
| cut -f 2 -d "," | \ | ||||
| grep -F "." | \ | ||||
|  | @ -95,11 +99,31 @@ grep -Fx -f "top-1m-well-known.txt" > "phishing-top-domains.txt" | |||
| cat "phishing-domains.txt" | \ | ||||
| grep -F -vf "phishing-top-domains.txt" > "phishing-notop-domains.txt" | ||||
| 
 | ||||
| ## Parse phishing URLs from popular domains | ||||
| cat "phishing.txt" | \ | ||||
| grep -F -f "phishing-top-domains.txt" | \ | ||||
| sed "s/^/||/g" | \ | ||||
| sed "s/$/\$all/g" > "phishing-url-top-domains.txt" | ||||
| grep -F -f "phishing-top-domains.txt" > "phishing-url-top-domains-temp.txt" | ||||
| 
 | ||||
| rm -f "phishing-url-top-domains.txt" "phishing-url-top-domains-raw.txt" | ||||
| 
 | ||||
| ## Temporarily disable command print | ||||
| set +x | ||||
| 
 | ||||
| while read URL; do | ||||
|   HOST=$(echo "$URL" | cut -d"/" -f1) | ||||
|   URI=$(echo "$URL" | sed "s/^$HOST//") | ||||
| 
 | ||||
|   ## Separate host-only URL | ||||
|   if [ -z "$URI" ] || [ "$URI" = "/" ]; then | ||||
|     echo "$HOST" >> "phishing-notop-domains.txt" | ||||
|   else | ||||
|     ## Parse phishing URLs from popular domains | ||||
|     echo "$URL" | \ | ||||
|     sed -e "s/^/||/g" -e "s/$/\$all/g" >> "phishing-url-top-domains.txt" | ||||
|     echo "$URL" >> "phishing-url-top-domains-raw.txt" | ||||
|   fi | ||||
| done < "phishing-url-top-domains-temp.txt" | ||||
| 
 | ||||
| ## Re-enable command print | ||||
| set -x | ||||
| 
 | ||||
| 
 | ||||
| ## Merge malware domains and URLs | ||||
|  | @ -200,6 +224,50 @@ sed '1 i\'"$COMMENT"'' | \ | |||
| sed "1s/Blocklist/Unbound Blocklist/" > "../dist/phishing-filter-unbound.conf" | ||||
| 
 | ||||
| 
 | ||||
| set +x | ||||
| 
 | ||||
| ## Snort & Suricata rulesets | ||||
| rm -f "../dist/phishing-filter-snort2.rules" "../dist/phishing-filter-suricata.rules" | ||||
| 
 | ||||
| SID="100000001" | ||||
| while read DOMAIN; do | ||||
|   SN_RULE="alert tcp \$HOME_NET any -> \$EXTERNAL_NET [80,443] (msg:\"phishing-filter phishing website detected\"; flow:established,from_client; content:\"GET\"; http_method; content:\"$DOMAIN\"; content:\"Host\"; http_header; classtype:attempted-recon; sid:$SID; rev:1;)" | ||||
| 
 | ||||
|   SR_RULE="alert http \$HOME_NET any -> \$EXTERNAL_NET any (msg:\"phishing-filter phishing website detected\"; flow:established,from_client; http.method; content:\"GET\"; http.host; content:\"$DOMAIN\"; classtype:attempted-recon; sid:$SID; rev:1;)" | ||||
| 
 | ||||
|   echo "$SN_RULE" >> "../dist/phishing-filter-snort2.rules" | ||||
|   echo "$SR_RULE" >> "../dist/phishing-filter-suricata.rules" | ||||
| 
 | ||||
|   SID=$(( $SID + 1 )) | ||||
| done < "phishing-notop-domains.txt" | ||||
| 
 | ||||
| while read URL; do | ||||
|   HOST=$(echo "$URL" | cut -d"/" -f1) | ||||
|   URI=$(echo "$URL" | sed "s/^$HOST//") | ||||
| 
 | ||||
|   SN_RULE="alert tcp \$HOME_NET any -> \$EXTERNAL_NET [80,443] (msg:\"phishing-filter phishing website detected\"; flow:established,from_client; content:\"GET\"; http_method; content:\"$URI\"; http_uri; nocase; content:\"$HOST\"; content:\"Host\"; http_header; classtype:attempted-recon; sid:$SID; rev:1;)" | ||||
| 
 | ||||
|   SR_RULE="alert http \$HOME_NET any -> \$EXTERNAL_NET any (msg:\"phishing-filter phishing website detected\"; flow:established,from_client; http.method; content:\"GET\"; http.uri; content:\"$URI\"; endswith; nocase; http.host; content:\"$HOST\"; classtype:attempted-recon; sid:$SID; rev:1;)" | ||||
| 
 | ||||
|   echo "$SN_RULE" >> "../dist/phishing-filter-snort2.rules" | ||||
|   echo "$SR_RULE" >> "../dist/phishing-filter-suricata.rules" | ||||
| 
 | ||||
|   SID=$(( $SID + 1 )) | ||||
| done < "phishing-url-top-domains-raw.txt" | ||||
| 
 | ||||
| set -x | ||||
| 
 | ||||
| cat "../dist/phishing-filter-snort2.rules" | \ | ||||
| sed '1 i\'"$COMMENT"'' | \ | ||||
| sed "1s/Domains Blocklist/URL Snort2 Ruleset/" > "../dist/phishing-filter-snort2.rules.temp" | ||||
| mv "../dist/phishing-filter-snort2.rules.temp" "../dist/phishing-filter-snort2.rules" | ||||
| 
 | ||||
| cat "../dist/phishing-filter-suricata.rules" | \ | ||||
| sed '1 i\'"$COMMENT"'' | \ | ||||
| sed "1s/Domains Blocklist/URL Suricata Ruleset/" > "../dist/phishing-filter-suricata.rules.temp" | ||||
| mv "../dist/phishing-filter-suricata.rules.temp" "../dist/phishing-filter-suricata.rules" | ||||
| 
 | ||||
| 
 | ||||
| ## IE blocklist | ||||
| COMMENT_IE="msFilterList\n$COMMENT\n: Expires=1\n#" | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue