Loading repository data…
Loading repository data…
0xDanielLopez / repository
TweetFeed collects Indicators of Compromise (IOCs) shared by the infosec community at Twitter. Here you will find malicious URLs, domains, IPs, and SHA256/MD5 hashes.
A transparent discovery signal based on current public GitHub metadata.
This score does not audit code, security, maintainers, documentation quality, or suitability. Verify the repository and its current documentation before adoption.

Everything in the dynamic blocks below (date, type counters, top tags, top reporters, output example) is regenerated by the pipeline every 15 minutes. Hand-written sections are stable.
If you like the project, please consider:
Live samples: today.csv
See tweetfeed.live/agents/ for the copy-paste MCP config and full tool reference.
| Type | Today | Week | Month | Year |
|---|---|---|---|---|
| :link: URLs | 212 | 536 | 5058 | 53894 |
| :globe_with_meridians: Domains | 185 | 388 | 4172 | 39997 |
| :triangular_flag_on_post: IPs |
| 28 |
| 150 |
| 734 |
| 11616 |
| :1234: SHA256 | 17 | 128 | 538 | 2257 |
| :1234: MD5 | 5 | 28 | 215 | 2557 |
| Tag | Today | Week | Month | Year |
|---|---|---|---|---|
| #phishing | 57 | 228 | 4251 | 35482 |
| #Kimsuky | 0 | 0 | 2148 | 15107 |
| #C2 | 161 | 197 | 454 | 14663 |
| #DPRK | 0 | 0 | 2146 | 13479 |
| #scam | 12 | 22 | 103 | 6237 |
| #CobaltStrike | 0 | 3 | 5 | 3587 |
| #malware | 5 | 85 | 564 | 2612 |
| #APT | 0 | 16 | 221 | 1765 |
| #Interactsh | 0 | 0 | 0 | 1593 |
| #Remcos | 7 | 9 | 92 | 1259 |
The full catalog of 120 tags with per-tag landing pages and CSV exports lives at tweetfeed.live/tags/.
| Number | User | IOCs |
|---|---|---|
| #1 | skocherhan | 278 |
| #2 | Kb4Threatlabs | 35 |
| #3 | bomccss | 29 |
| #4 | patialavii | 16 |
| #5 | tdatwja | 14 |
| #6 | c9lab_soc | 12 |
| #7 | Fact_Finder03 | 10 |
| #8 | Metemcyber | 8 |
| #9 | JAMESWT_WT | 8 |
| #10 | nextronresearch | 8 |
Search tweets that contain certain tags or that are posted by certain infosec people.
#phishing, #Kimsuky, #C2, #DPRK, #scam, #CobaltStrike, #malware,
#APT, #Interactsh, #Remcos
The full list of 120 tags lives at tweetfeed.live/tags/.
TweetFeed publishes the same data in CSV / JSON / RSS / MISP / STIX so you can wire it into whichever SIEM, EDR, or TIP you already run. Examples below default to year.csv (1-year window); swap to month.csv / week.csv / today.csv to keep the dataset smaller.
1. Match SHA256 hashes against the yearly feed
let MaxAge = ago(30d);
let SHA256_whitelist = pack_array(
'XXX' // Some SHA256 hash you want to whitelist.
);
let TweetFeed = materialize (
(externaldata(report:string)
[@"https://raw.githubusercontent.com/0xDanielLopez/TweetFeed/master/year.csv"]
with (format = "txt"))
| extend report = parse_csv(report)
| extend Type = tostring(report[2])
| where Type == 'sha256'
| extend SHA256 = tostring(report[3])
| where SHA256 !in(SHA256_whitelist)
| extend Tag = tostring(report[4])
| extend Tweet = tostring(report[5])
| project SHA256, Tag, Tweet
);
union (
TweetFeed
| join (
DeviceProcessEvents
| where Timestamp > MaxAge
) on SHA256
), (
TweetFeed
| join (
DeviceFileEvents
| where Timestamp > MaxAge
) on SHA256
), (
TweetFeed
| join (
DeviceImageLoadEvents
| where Timestamp > MaxAge
) on SHA256
) | project Timestamp, DeviceName, FileName, FolderPath, SHA256, Tag, Tweet
2. Match IP addresses against the monthly feed
let MaxAge = ago(30d);
let IPaddress_whitelist = pack_array(
'XXX' // Some IP address you want to whitelist.
);
let TweetFeed = materialize (
(externaldata(report:string)
[@"https://raw.githubusercontent.com/0xDanielLopez/TweetFeed/master/month.csv"]
with (format = "txt"))
| extend report = parse_csv(report)
| extend Type = tostring(report[2])
| where Type == 'ip'
| extend RemoteIP = tostring(report[3])
| where RemoteIP !in(IPaddress_whitelist)
| where not(ipv4_is_private(RemoteIP))
| extend Tag = tostring(report[4])
| extend Tweet = tostring(report[5])
| project RemoteIP, Tag, Tweet
);
union (
TweetFeed
| join (
DeviceNetworkEvents
| where Timestamp > MaxAge
) on RemoteIP
) | project Timestamp, DeviceName, RemoteIP, Tag, Tweet
3. Match URLs and domains against the weekly feed
let MaxAge = ago(30d);
let domain_whitelist = pack_array(
'XXX' // Some URL/Domain you want to whitelist.
);
let TweetFeed = materialize (
(externaldata(report:string)
[@"https://raw.githubusercontent.com/0xDanielLopez/TweetFeed/master/week.csv"]
with (format = "txt"))
| extend report = parse_csv(report)
| extend Type = tostring(report[2])
| where Type in('url','domain')
| extend RemoteUrl = tostring(report[3])
| where RemoteUrl !in(domain_whitelist)
| extend Tag = tostring(report[4])
| extend Tweet = tostring(report[5])
| project RemoteUrl, Tag, Tweet
);
union (
TweetFeed
| join (
DeviceNetworkEvents
| where Timestamp > MaxAge
) on RemoteUrl
) | project Timestamp, DeviceName, RemoteUrl, Tag, Tweet
The same KQL works in Microsoft Sentinel if you replace DeviceProcessEvents / DeviceNetworkEvents with the equivalent Sentinel tables (SecurityEvent, CommonSecurityLog, etc.).
Schedule a recurring CSV import via the Add-on Builder or the inputs.conf REST modular input. Then:
index=firewall earliest=-30d
| join dest_ip [
| inputlookup tweetfeed_iocs.csv
| where Type="ip"
| rename Value AS dest_ip
| fields dest_ip, Tags, Tweet
]
| stats count by src_ip, dest_ip, Tags
For proxy / DNS logs vs. URLs and domains:
index=proxy sourcetype=zscaler earliest=-7d
| join url [
| inputlookup tweetfeed_iocs.csv
| where Type IN ("url","domain")
| rename Value AS url
| fields url, Tags, Tweet
]
| table _time, src, dest, url, Tags, Tweet
For process-execution hashes:
index=endpoint sourcetype=Sysmon EventCode=1 earliest=-30d
| eval hash=lower(Hashes)
| join hash [
| inputlookup tweetfeed_iocs.csv
| where Type IN ("sha256","md5")
| rena